✅作者簡介:熱愛後端語言的大學生
二叉樹題解目錄
- 🔥前言
- 1、二叉樹的下一個結點
- 1.1、題目速覽
- 1.2、個人題解
- 1.2.1、解題思路
- 1.2.2、代碼實作
- 1.2.3、代碼解析
- 2、對稱的二叉樹
- 2.1、題目速覽
- 2.2、個人題解
- 2.2.1、解題思路
- 2.2.2、代碼實作
- 2.2.3、代碼解析
🔥前言
本篇文章給大家分享牛客網《劍指offer》專欄中有關二叉樹的經典算法題解,我會按照自己的了解與思路幫助大家搞懂算法流程。
1、二叉樹的下一個結點
1.1、題目速覽
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO0UDM1IjZxQDM4ETOjRzNzYzXwIzNykTM2EzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
1.2、個人題解
1.2.1、解題思路
1. 我們首先要根據給定輸入中的結點指針向父級進行疊代,直到找到該樹的根節點;
2. 然後根據根節點進行中序周遊,當周遊到和給定樹節點相同的節點時,下一個節點就是我們的目标傳回節點
具體步驟:
- 根據目前結點,利用題目所給條件找到根結點
- 書寫中序周遊的函數,傳入根結點
- 将中序周遊的結點儲存在結點數組裡
- 将傳入的二叉樹結點與數組元素比對,傳回數組的下一個元素
1.2.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:
vector<TreeLinkNode*>nodes;
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
TreeLinkNode* root=pNode;
//利用父指針找到根結點
while(root->next)
root=root->next;
//調用中序周遊
InOrder(root);
int num=nodes.size();
for(int i=0;i<num;i++){
TreeLinkNode *cur=nodes[i];
if(pNode==cur){
return nodes[i+1];
}
}
return NULL;
}
//書寫中序周遊
void InOrder(TreeLinkNode* root){
if(root==NULL) return;
InOrder(root->left);
nodes.push_back(root);
InOrder(root->right);
}
};
1.2.3、代碼解析
- 首先建立動态數組
,注意是建立在方法外部,目的是可以在類内任意使用nodes
- 建立的
結點并借助root
循環通過父指針while
找到根結點next
- 書寫
中序周遊函數,将中序周遊結果存入上方建立的InOrder
數組中nodes
- 使用
循環将傳入結點for
與數組元素比較,如果比對到就傳回位置加一的結點pNode
2、對稱的二叉樹
2.1、題目速覽
2.2、個人題解
2.2.1、解題思路
- 兩種方向的前序周遊,同步過程中的目前兩個節點,同為空,屬于對稱的範疇。
- 目前兩個節點隻有一個為空或者節點值不相等,已經不是對稱的二叉樹了。
- 第一個節點的左子樹與第二個節點的右子樹同步遞歸對比,第一個節點的右子樹與第二個節點的左子樹同步遞歸比較。
2.2.2、代碼實作
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot) {
return dgfunc(pRoot,pRoot);
}
bool dgfunc(TreeNode* root1,TreeNode* root2){
if(root1==NULL&&root2==NULL)
return true;
if(root1==NULL||root2==NULL||root1->val!=root2->val)
return false;
return dgfunc(root1->left, root2->right) && dgfunc(root1->right,root2->left);
}
};
2.2.3、代碼解析
- 編寫
函數,将dgfunc
傳入比較pRoot
- 前兩個if是遞歸結束的條件:
- 如果結點相同傳回
true
- 如果一邊為
或者左子樹與右子樹不同,傳回NULL
false
- 調用遞歸,比較左右子樹,都相同就傳回
,不相同則傳回true
false