網站首頁 編程語言 正文
題目描述
給定一個二叉樹其中的一個結點,請找出中序遍歷順序的下一個結點并且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的next指針。下圖為一棵有9個節點的二叉樹。樹中從父節點指向子節點的指針用實線表示,從子節點指向父節點的用虛線表示
示例:
輸入:{8,6,10,5,7,9,11},8
返回:9
解析:這個組裝傳入的子樹根節點,其實就是整顆樹,中序遍歷{5,6,7,8,9,10,11},根節點8的下一個節點就是9,應該返回{9,10,11},后臺只打印子樹的下一個節點,所以只會打印9,如下圖,其實都有指向左右孩子的指針,還有指向父節點的指針,下圖沒有畫出來
數據范圍:節點數滿足1≤n≤50 ?,節點上的值滿足1≤val≤100?
要求:空間復雜度 O(1) ?,時間復雜度 O(n)?
示例:
輸入:
{8,6,10,5,7,9,11},8
返回值:
9
解題思路
本題考察數據結構樹的使用。兩個方法:
1)暴力破解。通過next指針獲取根結點,對其進行中序排序,排序過程中用vector存儲,然后直接根據位置輸出即可。
2)結合中序排序性質。若某個結點存在右子樹,則右子樹的最左孩子就是它的下一個結點;若不存在右子樹,則它的第一個右父親,就是它的下一個結點。
測試代碼
1)暴力破解
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; // 確定根結點 TreeLinkNode* root=pNode; while(root->next) { root=root->next; } // 中序排序 vectorv; inorder(root,v); for(int i=0;i &v) { if(!root) return; // 中序排序 inorder(root->left,v); v.push_back(root); inorder(root->right,v); } };
2)結合中序排序性質
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; // 判斷是否存在右子樹 if(pNode->right) { TreeLinkNode* target=pNode->right; // 取最左孩子 while(target->left) { target=target->left; } return target; } // 不存在右子樹,尋找第一個右父親 while(pNode->next) { if(pNode->next->left==pNode) return pNode->next; pNode=pNode->next; } return NULL; } };
原文鏈接:https://blog.csdn.net/zhaitianbao/article/details/123876984
相關推薦
- 2022-05-12 Android10 分享微信提示獲取資源失敗
- 2022-05-20 Maven下載安裝配置詳細過程
- 2022-02-28 gyp info it worked if it ends with ok npm ERR 解決辦法
- 2022-09-30 react中使用usestate踩坑及解決_React
- 2023-11-17 Python如何使用matlibplot繪制3D柱形圖
- 2023-01-18 Android事件與手勢操作詳解_Android
- 2022-10-28 Django靜態文件配置request對象方法ORM操作講解_python
- 2022-06-20 關于go-micro與其它gRPC框架之間的通信問題及解決方法_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支