剑指offer-57.二叉树的下一个结点

来源:互联网 发布:明星互动软件 编辑:程序博客网 时间:2024/06/06 09:16

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


思路://给定节点pNode,要求用中序遍历顺序找出该节点的下一个节点
        //分以下几种情况
        //1.该节点为尾节点,则其下一个节点为空,return NULL;
        //2.该节点有右子树,按照中序遍历,则该节点的下一个节点为右子树最左节点
        //3.该节点没有右子树,按照中序遍历,
        //分为两种情况,
        //3.1该节点为其父节点的左孩子,很显然按照中序遍历,其父节点就是该节点的下一个节点
        //3.1该节点为其父节点的右孩子,很显然按照中序遍历,找它的父节点的



/*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)    {        //为尾节点,那它的下一个节点就是NULL        if (pNode == NULL)            return NULL;        //该节点有右子树,那么为右子树的最左节点        if (pNode->right != NULL)        {            pNode = pNode->right;            while (pNode->left != NULL)            {                pNode = pNode->left;            }            return pNode;        }        //该节点没有右子树,应该有两种情况,1.该节点是父节点的左孩子,按照中序遍历,左中右,那么其父节点就是该节点的下一个节点        //2.该节点是父节点的右孩子,找到其父节点的父节点,直到父节点为其父节点的父节点的左孩子,        while (pNode->next != NULL)        {            if (pNode->next->left == pNode)                return pNode->next;            else             {                pNode = pNode->next;            }                    }        return NULL; //找到根节点都找不到                    }};


0 0
原创粉丝点击