剑指offer-57:二叉树的下一个节点
给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回,即求当前节点的后继。
求二叉树节点的后继需要分情况讨论:
1.若当前节点有右儿子,则右子树最左侧的节点即为当前节点的后继,如F的后继是H;
2.若当前节点没有右子树,需要沿着父节点一直往上找,找到第一个是其父节点左儿子的节点,该父节点即为所求节点的后继。如当前节点为D,第一个满足其父节点的左儿子的节点为C,则C的父节点F即为当前节点D的后继。
代码如下:
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* p) {
if (p->right) {
p = p->right;
while (p->left) p = p->left;
return p;
}
while (p->father && p == p->father->right) p = p->father;
return p->father;
}
};
牛客网OJ对应如下:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* p) {
if (p->right) {
p = p->right;
while (p->left) p = p->left;
return p;
}
TreeLinkNode* parent = p->next; //opps
while (parent && p == parent->right){
p = parent;
parent = parent->next; //opps
}
return parent;
}
};