二叉树的下一个结点

二叉树的下一个结点

题目描述

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

思路: 若节点有右节点, 返回右节点的左子节点的左子节点直至叶子节点

若节点没有右节点, 则返回该结点的父节点支路的右节点

class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if (nullptr == pNode) {
            return nullptr;
        }
        
        TreeLinkNode *ret = nullptr;
        
        if (nullptr != pNode->right) {        // 如果有右节点
            TreeLinkNode *pRight = pNode->right;
            while (nullptr != pRight->left) {    // 找到右节点的左节点
                pRight = pRight->left;
            }
            ret = pRight;
        }
        else if (nullptr != pNode->next){                                // 没有右节点
            TreeLinkNode *pCurrent = pNode;
            TreeLinkNode *pParent = pNode->next;    // 当前节点的父节点
            
            while ((nullptr != pParent) && (pParent->right == pCurrent)) {    // 直至父节点的左子节点
                pCurrent = pParent;
                pParent = pParent->next;
            }
            ret = pParent;
        }
        
        return ret;
    }
};
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
posted @ 2019-03-10 15:25  张飘扬  阅读(140)  评论(0编辑  收藏  举报