剑指Offer——二叉树的下一个结点

题目描述

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

(实际题目给的是二叉树中的一个结点,给出该结点的下一个结点)

解题思路

一棵树中,给定其中的一个结点,我们分别分析下,在中序遍历条件下,该结点的下一个结点在哪:

(建议大家画图理解下)

因为是中序遍历,该结点的左子树部分肯定在结点前遍历完成,所以不用考虑该结点的左结点。

考虑下该结点的右结点:

若右结点不为空

中序遍历下,该节点的下一个结点是其右子树的最左侧结点

若右结点为空

表示以该结点为根的部分遍历结束,需要回到其上一层根节点。

如果其是父节点左孩子,那么父节点就是下一个节点 ; 若是父节点的右孩子,则找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子。

(建议随便画一个二叉树,写出中序遍历,然后从二叉树中找符合情况的结点,对着代码思考)

题解

    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {   
        // 1. 空  没啥好说的
        if (pNode == null) return null;
        // 2. 若其右子树不空
        if (pNode.right != null){
            pNode = pNode.right;
            while (pNode.left!=null){
                pNode = pNode.left;
            }
            return pNode;
        }
        // 3. 这是建立在右子树为空的基础上,
        while (pNode.next != null){
            // 条件是 父节点的左子结点是其本身,若不是继续父节点遍历
            if (pNode.next.left == pNode) return pNode.next;
            pNode = pNode.next;
        }
        // 4、建立再 父节点的父节点...的父节点为空,实际上回溯到根上了,
        // 那么该结点就是 尾结点 下一个就是Null
        return null;
    }

你可能感兴趣的:(剑指Offer——二叉树的下一个结点)