劍指Offer學習-面試題8:二叉樹的下一節點

	/**
     * 二叉樹的下一個節點
     * 給定一顆二叉樹和其中的一個節點,找到其後繼節點(中序遍歷中的下一個節點就是後繼節點)
     * <p>
     * 1.如果一個節點有右子樹,那麼後繼節點就是右子樹中的最左節點。
     * 2.如果一個節點無右子樹並且是它父節點的左節點,那麼它的後繼節點就是父節點。
     * 3.如果一個節點無右子樹並且是它父節點的右節點,那麼沿着父節點向上遍歷,找到一個節點是它父節點的左孩子節點,
     * 如果該節點存在,那麼這個節點的父節點就是後繼節點。
     *
     * @param root
     * @param cur
     * @return
     */
    public Node getNext(Node root, Node cur) {
        if (null == root || null == cur) return root;
        //默認該節點已存在
        if (cur.right != null) {
            Node right = cur.right;
            while (right.left != null && right.left.left != null)
                right = right.left;
            return right;
        } else {
            Node parent = cur.parent;
            if (parent.left == cur) return parent;
            if (parent.right == cur) {
                while (parent.parent != null) {
                    Node parentParent = parent.parent;
                    if (parentParent.left == parent)
                        return parentParent;
                    parent = parent.parent;
                }
            }
        }
        return null;
    }

    public class Node {
        public int value;
        public Node left;
        public Node right;
        public Node parent;

        public Node(int data) {
            this.value = data;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章