
要想解决这个问题就必须要先知道当前节点与其后继节点之间究竟存在什么关系。
由数据结构的知识可以得知:如果当前节点存在右子树,则其后继节点一定是右子树上最左端的节点。如果不存在右子树,则其后继节点一定是其所属最小左子树的父亲。
因此就得到了求后继节点的具体方法:如果当前节点存在右子树,则将指针指向有孩子节点,然后不断向左子树遍历找到左孩子为空的节点并返回。如果当前节点不存在右子树,则判断其父亲结点的左孩子是否为当前节点,是则返回,不是则向上遍历。
具体代码如下:
/**
* 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){
p = p -> right;
while(p -> left) p = p-> left;
return p;
}
else if(p -> father){
while(p -> father && p -> father -> right == p) //注意先保证父亲节点存在
p = p -> father;
return p -> father;
}
else return NULL;
}
};
另外还要注意的是,当前节点存在右孩子和当前节点存在父亲的两个逻辑判断是不可以颠倒的!大家构造几个特例就明白是怎么回事了。
本文详细解析了二叉树中寻找中序后继节点的方法,介绍了当节点有右子树和无右子树时的不同处理策略,并提供了具体的实现代码。
1062

被折叠的 条评论
为什么被折叠?



