题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
- 如果有右子树:那就是右子树的最左节点
- 如果没有右子树:向上找祖先,如果它是该祖先的左子孙,则是; 如果找不到,那本身就是最后一个节点,下一个是null
代码
public class TreeLinkNode {
public int val;
public TreeLinkNode left = null;
public TreeLinkNode right = null;
public TreeLinkNode next = null; //指向父节点
public TreeLinkNode(int val)
{ this.val = val;
}
}
public TreeLinkNode getNext(TreeLinkNode n){
if (n==null)return null;
if (n.right!=null){//有右子树:找右子树最左节点
TreeLinkNode left = n.right;
while (left.left!=null)left= left.left;
return left;
}else{//没有右子树,找为其左子孙的第一个祖先。
TreeLinkNode father = n;
while (father!=null){
if (father.next!=null && father.next.left == father)return father.next;
father = father.next;
}
return null;//找不到,那它本身就是最后一个,下一个是null
}
}
扩展思考
如果是前序,怎么找?
- 有左子节点,就是左子节点
- 没有左子节点:
- 有右子节点:就是右子节点
- 没有右子节点(叶节点):向上找,找祖先的右子节点(异己的)
如果是后序,怎么找?
后序说明当前节点的子节点都在自己前面,只有父节点在自己后面。
- 如果没有父节点(根节点):下一个是null
- 有父节点:
- 父节点右子节点是自己或者为空:下一个就是父节点
- 父节点右子节点不为空且不是自己(即作为左节点):找该右子树的最左节点