二叉树的下一个结点

来源:互联网 发布:淘宝进货来源 编辑:程序博客网 时间:2024/04/29 10:08

Again !

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

解题思路:分三种情况,
1):该结点有右孩子,则中序遍历下一个结点就是该结点右子树中的最左子结点;
2):该结点无右孩子,且该结点是其父结点的左孩子,则中序遍历的下一个结点就是其父结点;
3):该结点无右孩子,且该结点是其父结点的右子结点,这种情况比较复杂,我们可以沿着指向父结点的指针一直向上遍历,直到找到一个是它父结点的左子结点的结点。如果这 样的结点存在,那么这个结点的父结点就是我们要找的中序遍历下一个结点。

 TreeLinkNode* GetNext(TreeLinkNode* pNode)    { //分三种情况讨论        if(pNode==NULL)            return pNode;        TreeLinkNode* target=NULL;        TreeLinkNode* nextP=NULL;        //有右孩子        if(pNode->right!=NULL)        {            nextP=pNode->right;            while(nextP->left != NULL)                nextP=nextP->left;             target=nextP;        }        else if(pNode->next!=NULL) //没有右孩子; 首先要判断父结点要存在呀!!!!        {            TreeLinkNode* parentNode=pNode->next;            TreeLinkNode* currNode=pNode;            while(parentNode!=NULL && parentNode->left!=currNode)            {                currNode=parentNode;                parentNode=parentNode->next;            }            target=parentNode;                        /*            if(pNode->next->left==pNode)//没有右孩子,且是父结点的左孩子结点                target=pNode->next;            else // 没有左孩子,且是父结点的右孩子结点            {                while(pNode->next->next!=NULL && pNode->next!=pNode->next->next->left)                    pNode=pNode->next;                if(pNode->next->next==NULL)                    target=NULL;                else                    target=pNode->next->next;              }*/        }        return target;    }


0 0
原创粉丝点击