题设要求:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并返回。
问题分析:首先,中序遍历的顺序是左-根-右。由此,我们可以对当前节点分情况讨论。
情况1 如果当前节点有右子树,那么下个节点就是右子树最左边的节点。
情况2 如果当前节点没有右子树,再分两种情况:
情况2.1 是父节点左孩子,父节点是下一节点;
情况2.2 是父节点的右孩子,找他的父节点的父节点,直到当前节点是其父节点的左孩子,如果没有,他就是尾节点。
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public 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;
}
//没有右子树的,分两种情况:
//1、是父节点左孩子,父节点是下一节点;
//2、是父节点的右孩子,找他的父节点的父节点,直到当前节点是其父节点的左孩子,如果没有,他就是尾节点。
while(node.next!=null)
{
if(node.next.left==node)return node.next;
node=node.next;
}
return null;
}
}