• 二叉树的下一节点


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

    【思路】这道题目很坑人的就是parent指针不叫parent,叫做next, 也太奇葩了吧,不过无所谓啦,中序遍历的下一个节点主要分为两种情况:

    情况一: 该节点存在右子树,则右子树的最左端的节点即为该节点的下一节点,我们遍历去寻找就可以了!

    情况二: 该节点不存在右子树,则可以分成两种情况

    1.如果该节点为右节点,那么需要一直向上遍历,直到找到某个节点是左节点,停止,则左节点的父节点为下一节点。

    2.如果该节点为左节点,那么其父节点为下一节点!

    /*
    struct TreeLinkNode {
        int val;
        struct TreeLinkNode *left;
        struct TreeLinkNode *right;
        struct TreeLinkNode *next;
        TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
    
        }
    };
    */
    class Solution {
    public:
        TreeLinkNode* GetNext(TreeLinkNode* pNode)
        {
            if(pNode == nullptr)
                return nullptr;
            TreeLinkNode* pNext = nullptr;
            if(pNode->right != nullptr)     //情况一:有右子树
            {
                TreeLinkNode* pRight = pNode->right;
                while(pRight->left != nullptr)    
                    pRight = pRight->left;    //查找右子树的最左端节点
                pNext = pRight;
            }
            else if(pNode->next != nullptr)   //情况二:右子树为空
            {
                TreeLinkNode *pCurrent = pNode;
                TreeLinkNode *pParent = pNode->next;
                while(pParent != nullptr && pCurrent == pParent->right) 
                    //2.1 右子树为空且该节点为右节点,则一直向上查找,直到该节点为父节点的左节点,
                    //则该节点的父节点为下一节点
                {
                    pCurrent = pParent;
                    pParent = pParent->next;
                }
                //2.2 右子树为空且为左节点,则父节点为下一节点
                pNext = pParent;
            }
             return pNext;
        }
    };
  • 相关阅读:
    servlet ; basepath ; sendredirected ;
    4.18 一个阶段
    服务器强迫患者 ;软件试用狂人
    html ; css ; javascript ; json ;
    评审意见
    Beta版使用说明书
    内测版发布反思问题总结
    团队项目第二阶段冲刺第十天
    团队项目第二阶段冲刺第九天
    团队项目第二阶段冲刺第八天
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11456043.html
Copyright © 2020-2023  润新知