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

Posted silentteller

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
    }
}

以上是关于剑指Offer-57.二叉树的下一个结点(C++/Java)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer57:二叉树的下一个结点

剑指offer57 二叉树的下一个结点

剑指offer(57)二叉树的下一个节点

《剑指Offer——从中序遍历中找出二叉树的下一个结点》代码

剑指offer面试题 8. 二叉树的下一个结点

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