美文网首页
面试题8:找出中序遍历的下一个节点

面试题8:找出中序遍历的下一个节点

作者: 修司敦 | 来源:发表于2018-11-12 12:03 被阅读0次
给定一颗二叉树和其中的一个节点,找出中序遍历序列中的下一个节点。树节点的结构声明为
struct BTreeNode
{
    int        value;
    BTreeNode* pLeft;
    BTreeNode* pRight;
    BTreeNode* pParent;
};

解析:分两种情况:

  • 如果这个节点有右子树:下一个遍历的节点就是右子树中最靠左的节点;
  • 如果这个节点没有右子树:
    -- 如果这个节点是根节点,那就没有下一个遍历的节点;
    -- 如果这个节点是左节点,那么下一个遍历的节点是这个节点的双亲节点;
    -- 如果这个节点是有节点,那么下一个遍历的节点就需要向上找,找到第一个是左节点的双亲节点,并返回这个双亲节点的双亲节点;如果找不到的话就说明没有下一个要遍历的节点。

答案:

inline bool isRoot(BTreeNode *pNode)
{
    if (nullptr == pNode) return false;
    return nullptr==pNode->pParent;
}

inline bool isLeft(BTreeNode *pNode)
{
    if (nullptr == pNode) return false;
    if (nullptr != pNode->pParent)
        return pNode == pNode->pParent->pLeft;
    return false;
}

inline bool isRight(BTreeNode *pNode)
{
    if (nullptr == pNode) return false;
    if (nullptr != pNode->pParent)
        return pNode == pNode->pParent->pRight;
    return false;
}

BTreeNode* GetNext(BTreeNode* pNode)
{
    if (pNode == nullptr) return nullptr;

    //if this node has a right subtree
    if (nullptr != pNode->pRight)
    {
        auto pTemp = pNode->pRight;
        while (nullptr != pTemp->pLeft) pTemp = pTemp->pLeft;
        return pTemp;
    }

    //if this node doesn't have a right subtree
    else
    {
        if (isRoot(pNode)) return nullptr;
        else if (isLeft(pNode))
            return pNode->pParent;
        else if (isRight(pNode))
        {
            while (isRight(pNode)) pNode = pNode->pParent;
            if (isLeft(pNode)) return pNode->pParent;
            else if (isRoot(pNode)) return nullptr;
        }
    }

    return nullptr;
}

相关文章

  • 面试题8:二叉树的下一个节点

    面试题8:二叉树的下一个节点 题意:给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。树中节点还有一个...

  • 二叉树的下一个节点

    《剑指offer》面试题8:二叉树的下一个节点 题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个...

  • 【剑指 offer】- 二叉树的下一个结点(中序)

    1、题目描述 给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。 注意: 如果给定的节点是中序遍历序列...

  • 面试题 04.06. 后继者

    面试题 04.06. 后继者设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点...

  • 面试题8:找出中序遍历的下一个节点

    给定一颗二叉树和其中的一个节点,找出中序遍历序列中的下一个节点。树节点的结构声明为 解析:分两种情况: 如果这个节...

  • 剑指offer学习笔记:8.4 树

    面试题58:二叉树的下一个节点给定一个二叉树和其中一个节点,如何找到中序遍历顺序的下一个节点?树中的节点除了有两个...

  • 剑指offer—面试题8: 二叉树的下一个节点

    题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左、右节点的指针,...

  • BinaryTree遍历(递归和非递归)

    前序遍历 前序遍历: 根节点->左节点->右节点 递归方式:代码实现 非递归方式: 中序遍历 中序遍历: 左节点...

  • 二叉树的下一个节点

    给定二叉树和其中某一节点,找出该节点在中序遍历序列的下一个节点 思路:1.如果该节点有右子树,它的后继节点是右子树...

  • 面试题8:二叉树的下一个节点

    题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的...

网友评论

      本文标题:面试题8:找出中序遍历的下一个节点

      本文链接:https://www.haomeiwen.com/subject/wgwqfqtx.html