【剑指offer】二叉树的下一个节点

给出一棵二叉树和一个节点,求中序遍历序列的下一个节点。二叉树结构是给出了左右节点以及父节点的。


首先分析中序遍历,中序遍历即左父右的顺序遍历树。

分析规律:

(1)节点存在右节点 if(p->right)


则不断检查p->right是否还有左节点,若没有左节点了,该节点即为res。

        if(pNode->right)     // 若存在右节点
        {
            TreeLinkNode* pRight = pNode->right;
            while(pRight->left) {            // 有左节点,则继续搜寻;无左节点,则返回该点
                pRight = pRight->left;
            }
            nextNode = pRight;
        }

(2)节点不存在右节点,且该节点还存在父节点


如1与2,不断判断节点是否为父节点的左节点,若为左节点则说明该父节点为res

特例3,一直不满足,则节点的父节点终会变为nullptr,结果即返回nullptr

else if(pNode->next) {     // 不为根节点且不存在右节点
            TreeLinkNode* pCurr = pNode;
            TreeLinkNode* pNext = pCurr->next;
            while(pNext && pCurr == pNext->right) {
                pCurr = pCurr->next;
                pNext = pNext->next;
            }
            nextNode = pNext;
        }

(3) 上两者情况都不满足,则说明是个没有右节点的根节点,返回nullptr


TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(!pNode)
            return nullptr;
        TreeLinkNode* nextNode;
        if(pNode->right)     // 若存在右节点
        {
            TreeLinkNode* pRight = pNode->right;
            while(pRight->left) {            // 有左节点,则继续搜寻;无左节点,则返回该点
                pRight = pRight->left;
            }
            nextNode = pRight;
        }
        else if(pNode->next) {     // 不为根节点且不存在右节点
            TreeLinkNode* pCurr = pNode;
            TreeLinkNode* pNext = pCurr->next;
            while(pNext && pCurr == pNext->right) {
                pCurr = pCurr->next;
                pNext = pNext->next;
            }
            nextNode = pNext;
        }
        return nextNode;
    }

猜你喜欢

转载自blog.csdn.net/weixin_38628152/article/details/80083423