二叉树的下一个中序节点

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

分析

  • 如果有右子树:那就是右子树的最左节点
  • 如果没有右子树:向上找祖先,如果它是该祖先的左子孙,则是; 如果找不到,那本身就是最后一个节点,下一个是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
  • 有父节点:
    • 父节点右子节点是自己或者为空:下一个就是父节点
    • 父节点右子节点不为空且不是自己(即作为左节点):找该右子树的最左节点
posted @ 2020-06-24 16:06  Edwin_Xu  阅读(141)  评论(0编辑  收藏  举报