剑指Offer-57.二叉树的下一个结点(C++/Java)

题目:

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

分析:

二叉树的中序遍历是左根右,所以如果一个结点的右子树不为空,那么这个节点的下一个节点一定是右子树的最左结点,如果右子树不存在左子树的话,就返回右子树的根结点。

如果一个结点的右子树为空,且当前结点是其父结点的左子树的根结点,那么直接返回其父节点,否则就一直访问其父结点,直到找到一个结点是其父结点的左子结点,同样返回其父结点。

程序:

C++

class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(pNode == nullptr)
            return pNode;
        if(pNode->right != nullptr){
            pNode = pNode->right;
            while(pNode->left != nullptr)
                pNode = pNode->left;
            return pNode;
        }
        while(pNode->next != nullptr && pNode->next->left != pNode){
            pNode = pNode->next;
        }
        return pNode->next;
    }
};

Java

public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode == null)
            return pNode;
        if(pNode.right != null){
            TreeLinkNode p = pNode.right;
            while(p.left != null)
                p = p.left;
            return p;
        }
        while(pNode.next != null && pNode.next.left != pNode){
            pNode = pNode.next;
        }
        return pNode.next;
    }
}

猜你喜欢

转载自www.cnblogs.com/silentteller/p/12114894.html