题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
根据中序遍历的特点,将这个问题划分成三种情况:
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;
}
运行结果: