二叉树的下一个节点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
中序遍历顺序是:左根右。结合下图,可以看到
- 有右子树的,下一个节点就是右子树最左边的节点。比如2、1、3、6.
- 没右子树的。
- 如果是父节点的左孩子,如9。下一个节点就是父节点。
- 是父节点右孩子的,就要依次向上找父节点,直到这个“父节点”是其父节点的左孩子。如8、5。如果没有,则说明到尾部了,如7.
实现
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){ //没右子树,则找第一个当前节点是父节点左孩子的节点
if(node.next.left == node) return node.next;
node = node.next;
}
return null; //退到了根节点仍没找到,则返回null
}