二叉树的下一节点

时间:2019-09-03
本文章向大家介绍二叉树的下一节点,主要包括二叉树的下一节点使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

【思路】这道题目很坑人的就是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;
    }
};

原文地址:https://www.cnblogs.com/zhudingtop/p/11456043.html