二叉树的下一个节点(模拟)
题目来源:https://www.acwing.com/problem/content/31/
思路:
模拟,中序遍历时,本节点的下一个节点分为两种情形讨论
当本节点存在右子树,直接找右子树的最左节点,即是中序遍历的下一个节点。
当本节点不存在右子树,则向上寻找最近可作为左儿子的节点(包含该节点)的父亲节点(联想中序遍历的规律,不存在右子树则要往上回溯,寻找最近未访问的根节点),该点为中序遍历的下一个节点,若下一个节点不存在,返回即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode *father;
* TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {}
* };
*/
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* p) {
if(p->right==NULL){///右子树为空,往上找点为可作为的左儿子的父亲
while(p->father&&p!=p->father->left){
p=p->father;
}
return p->father;
}
else{///如果右子树不为空,则找右子树的最左边的点即可
p=p->right;
while(p->left!=NULL){
p=p->left;
}
return p;
}
}
};