zoukankan      html  css  js  c++  java
  • 二叉树的下一节点

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

    【思路】这道题目很坑人的就是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;
        }
    };
  • 相关阅读:
    oracle与DB2
    oracle ORA-01427: 单行子查询返回多个行
    mysql开发总结
    mysql show profile基本详解
    mysql批量插入数据
    mysql索引详解
    mysql性能调优
    MySQL优化
    mysql主从调优
    mysql主从复制
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11456043.html
Copyright © 2011-2022 走看看