剑指offer——面试题58:二叉树的下一个结点

来源:互联网 发布:vi保存退出ubuntu 编辑:程序博客网 时间:2024/06/05 08:22

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

    代码:

/*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 == NULL)            return NULL;        TreeLinkNode* nextNode = NULL;        if(pNode->right != NULL)   // 如果该结点有右子树,那么下一个结点就是它右子树的最左子树        {            TreeLinkNode* pRight = pNode->right;            while(pRight->left != NULL)  // 通过循环,寻找右子树的最左子树                pRight =pRight->left;            nextNode = pRight;   // 返回下一个结点        }        else if(pNode->next != NULL)    // 如果该结点没有右子树,        {            TreeLinkNode* parent = pNode->next;            TreeLinkNode* current = pNode;            while(parent != NULL && current == parent->right)  // 如果该结点是它父结点的右子结点,不断沿着它父节点找,            {                                                  // 直到找到一个是它父节点的左子结点                current = parent;                parent = parent->next;            }            nextNode = parent;  // 如果该结点是它父节点的左结点,它下一个结点就是它的父结点        }        return nextNode;    }};

    分析:代码注释非常详尽了,不赘述。牛客网这题给的例程不好, next 其实表示的是父结点。