剑指Offer(十一)二叉树的下一个结点

题目:

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

思路:

根据中序遍历的特点,将这个问题划分成三种情况:

1,如果该结点有右子树,则返回该结点右子树的最左结点。

2,如果无右子树且该结点位于父节点的左侧,则返回父节点

3,如果无右子树且该结点位于父节点的右侧,则依次向上寻找,直至找到以其父节点作为左结点的结点,返回该结点。

程序代码:

#include<iostream>
using namespace std;

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)
            return pNode;
        if(pNode->right)
        {
            TreeLinkNode* p=pNode->right;
            while(p->left)
            {
                p=p->left;
            }
            return p;
        }
        if(pNode->next)
        {
            if(pNode==pNode->next->left)
            return pNode->next;
        if(pNode==pNode->next->right)
        {
            TreeLinkNode* q=pNode->next;
            while(q->next && q==q->next->right)
            {
                q=q->next;
            }
            return q->next;
        }
        }
        
    }

 TreeLinkNode* GetNext1(TreeLinkNode* pNode) //将有两种情况合并,变成一个找父节点的问题
    {
        if(!pNode)
            return pNode;
        if(pNode->right)
        {
            TreeLinkNode* p=pNode->right;
            while(p->left)
            {
                p=p->left;
            }
            return p;
        }
        while(pNode->next)
        {
            if(pNode==pNode->next->left)
                return pNode->next;
            pNode=pNode->next;
        }

    }
};
int main()
{
    TreeLinkNode *t1=new TreeLinkNode(1);
    TreeLinkNode *t2=new TreeLinkNode(2);
    TreeLinkNode *t3=new TreeLinkNode(3);
    TreeLinkNode *t4=new TreeLinkNode(4);
    TreeLinkNode *t5=new TreeLinkNode(5);
    TreeLinkNode *t6=new TreeLinkNode(6);
    TreeLinkNode *t7=new TreeLinkNode(7);
    t1->left=t2;
    t1->right=t3;
    t2->left=t4;
    t2->right=t5;
    t3->left=t6;
    t3->right=t7;
    t2->next=t1;
    t3->next=t1;
    t4->next=t2;
    t5->next=t2;
    t6->next=t3;
    t7->next=t3;
    Solution s;
    TreeLinkNode *m=s.GetNext(t1);
    TreeLinkNode *m1=s.GetNext1(t1);
    cout<<m->val<<endl;
    cout<<m1->val<<endl;
}


运行结果:



猜你喜欢

转载自blog.csdn.net/bubbler_726/article/details/80981729