题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
如果一个节点有右子树,那么他的下一个节点就是它的右子树中的最左节点。
如果一个节点没有右子树,如果节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。
如果一个节点即没有右子树,并且它还是它父节点的右子节点,我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是他父节点的左子节点的节点。
1 /* 2 public class TreeLinkNode { 3 int val; 4 TreeLinkNode left = null; 5 TreeLinkNode right = null; 6 TreeLinkNode next = null; 7 8 TreeLinkNode(int val) { 9 this.val = val; 10 } 11 } 12 */ 13 public class Solution { 14 public TreeLinkNode GetNext(TreeLinkNode node){ 15 if(node == null) return null; 16 if(node.right!=null){ //1、右节点不为空 17 //node 的下一个节点就是 当前node的右子树中,最左的节点 18 node = node.right; 19 while(node.left!=null) 20 node = node.left; 21 return node; 22 } 23 else if(node.next!=null){//2右节点为空,分2种情况 24 //2.1、node是父节点的左子节点,那么node的下一个节点就是它的父亲节点。 25 if(node.next.left==node) return node.next; 26 //2.2、node 即没有右子树,并且是父节点的右子节点,沿着指针一直往上遍历, 27 //直到找到一个是他父节点的左子节点的节点。 28 if(node.next.right==node){ 29 while(node.next!=null){ 30 if(node.next.left==node) return node.next; 31 node = node.next; 32 } 33 } 34 } 35 return null; 36 } 37 }