8.二叉树的下一个节点
题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右节点的指针,还有一个指向父节点的指针。
![二叉树的下一个节点](https://i-blog.csdnimg.cn/blog_migrate/d73d797e1f201ea5e6d239e764ef8065.png)
首先分析题目,在图中二叉树的中序遍历序列是{d,b,h,e,i,a,f,c,g},以上述的例子作为参考,分析这道题的解法。
情况一:如果一个节点有右子树,那么他的下一个节点就是他的右子树中的最左节点,也即是从右子节点开始,向左子节点寻找,就可以找到下一个节点。图中的b的下一个节点是h,节点a的下一个节点为f。
情况二:如果一个节点没有右子树,而且本身是父节点的左子节点,那么它的下一个节点就是父节点。图中节点h的下一个节点是e,节点d的下一个节点是b,节点f的下一个节点是c。
情况三:如果一个节点既没有右子树,也不是其父节点的左子树,我们需要从父结点的指针一直向上,直到找到一个节点是其父节点的父节点,且其父节点还是其的左子节点。这听起来比较复杂,我们用图片解释一下:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f3d3f6cdb2d1abeb47a0024d28ab2121.png)
class solution{
public TreeLinkNode getNetxNodeOfInOrder(TreeLinkNode node){
if (node.right != null) {
node = node.right;
while (node.left != null) {
node = node.left;
}
return node;
}
if (node.right == null) {
node = node.next;
}
while (node.next != null) {
if (node.next.left == node) {
return node.next;
node = node.next;
}
}
return null;
}
}