JZ57_二叉树的下一个结点
知识点:二叉树
题目链接
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
输入: {1,2,3,3,4,4,5}
输出: {1,2,5}
解题思路
情况1 情况1 情况3 情况2
2 3 1 1
\ \ / /
x x 2 x
\ \ \ /
1 2 3 2
/ \
1 4
1. 由于是中序遍历,我们可以知道是左根右,大的分为两种情况,存在右边子树和不存在
2. 情况1:存在右边子树,下一个是右边子树最左边的结点
3. 情况2:不存在右边子树,如果他是上个结点的左结点,那么就返回上个结点;
4. 情况3:不存在右边子树,如果是上个结点的右结点,继续往上找
或者直接找到 根节点 中序遍历放入数组去找
代码
#include "cheader.h"
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 == nullptr)
return nullptr;
if(pNode->right != nullptr){
TreeLinkNode* tmp = pNode->right;
while(tmp->left != nullptr)
tmp = tmp->left;
return tmp;
}
else{
if(pNode->next != nullptr && pNode->next->left == pNode)
return pNode->next;
else if(pNode->next != nullptr){
TreeLinkNode* n = pNode->next;
while(n->next != nullptr && n->next->right == n)
n = n->next;
return n->next;
}
}
return nullptr;
}
TreeLinkNode* GetNext2(TreeLinkNode* pNode) {
TreeLinkNode* root = nullptr;
TreeLinkNode* tmp = pNode;
while(tmp){
root = tmp;
tmp = tmp->next;
}
vector<TreeLinkNode*> v;
pre_order(v, root);
for(int i = 0; i < v.size();i++){
if(v[i] == pNode && i+1 != v.size())
return v[i+1];
}
return nullptr;
}
void pre_order(vector<TreeLinkNode*> &v,TreeLinkNode *root){
if(root == nullptr)
return;
pre_order(v, root->left);
v.push_back(root);
pre_order(v, root->right);
}
};
今天也是爱zz的一天!