7.二叉树的下一个节点 ----《剑指Offer》题解(Java)
题目
题目描述
给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。
样例
假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。
则应返回值等于3的节点。
解释:该二叉树的结构如下,2的后继节点是3。
2
/ \
1 3
算法思路
可以自己画一颗树,然后看当前节点的中序遍历的下一个节点在哪。
有两种情况,一种是节点有右子树,那么后继节点在右子树的最左叶子节点;另一种情况是,没有右子树,那后继节点可能在其祖父节点中,需要满足的情况是,当前节点的父节点是父节点的父节点的左子树,若不满足则继续向上查找。
代码实现
class Solution {
public TreeNode inorderSuccessor(TreeNode p) {
if(p == null) return null;
//1.有右子树,则是右子树的最左节点
if(p.right != null) {
p = p.right;
while(p.left != null) p = p.left;
return p;
}
//2.没有右子树,则找到父节点为其父节点的左子树
while (p.father != null && p.father.left != p) {
p = p.father;
}
//如果没右子树叶没父节点,应该返回null,此时p.father也满足
return p.father;
}
}