题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。(注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。)
题目中的next指向父节点的意思:
方法一:分三种情况:
-
有右子树,下一结点是右子树中的最左结点,例如 4,下一结点是 9;
-
无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 9,下一结点是 3;
-
无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。例如 10,下一结点是 5;例如 8,并没有符合情况的结点,所以 8 没有下一结点。
package test;
class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
class Solution {
TreeLinkNode GetNext(TreeLinkNode node){
if(node==null)
return null;
if(node.right!=null){ //如果有右子树,则找右子树的最左节点
node = node.right;
while(node.left!=null)
node = node.left;
return node;
}
while(node.next!=null){ //(节点3才是重点,不能为空)没右子树,则找第一个当前节点是父节点左孩子的节点
if(node.next.left==node)//对应9
return node.next;
node = node.next;//对应10
}
return null; //退到了根节点仍没找到,则返回null
}
}
public class Main{
public static void main(String[] args) {
TreeLinkNode p1 = new TreeLinkNode(5);
TreeLinkNode p2 = new TreeLinkNode(4);
TreeLinkNode p3 = new TreeLinkNode(6);
TreeLinkNode p4 = new TreeLinkNode(2);
TreeLinkNode p5 = new TreeLinkNode(3);
TreeLinkNode p6 = new TreeLinkNode(7);
TreeLinkNode p7 = new TreeLinkNode(8);
TreeLinkNode p8 = new TreeLinkNode(9);
TreeLinkNode p9 = new TreeLinkNode(10);
p1.left = p2;
p1.right = p3;
p2.left = p4;
p2.right = p5;
p3.left = p6;
p3.right = p7;
p5.left = p8;
p5.right = p9;
p1.next = null;
p2.next = p1;
p3.next = p1;
p4.next = p2;
p5.next = p2;
p6.next = p3;
p7.next = p3;
p8.next = p5;
p9.next = p5;
Solution p = new Solution();
TreeLinkNode b = p.GetNext(p9);
System.out.println("结果:" + b.val);
}
}