二叉树中查找值为x的结点,设计打印值为x的结点的所有祖先节点算法。
输入:
ABD0G000CE00F00\先序二叉树序列
D\值x
输出:
BA\D的所有祖先节点
输入:
A00\\先序二叉树序列
A\值x
输出:
0\输出0,代表没有祖先节点
如果输入的值x不存在,也输出0(字符0).
输入输出样例:1组
#1
样例输入:
ABD0G000CE00F00
B
样例输出:
A
//注意
//1:该程序每次运行的时间必须小于10秒,否则会超时,程序超时将不会测试剩余的测试集
//2:该程序每次运行使用的内存不能超过1M,否则会返回错误
//3:该程序每次运行输出的结果最多显示1000个字符(多余的不显示),每行末尾的所有空格用□表示
#include <iostream>
#define Maxsize 1024
using namespace std;
typedef struct bitnode
{
char node;
struct bitnode *lchild, *rchild;
}BiTNode,*BiTree;
BiTree SetNode();
void visit(BiTree b);
void PostOrder(BiTree T, char x);
int main()
{
BiTree bt;
bt=SetNode();
char x;
cin>>x;
PostOrder(bt,x);
return 0;
}
BiTree SetNode()
{
BiTree bt;
char node;
cin>>node;
if(node=='0')
{
bt=NULL;
}
else
{
bt=new BiTNode;
bt->node=node;
bt->lchild=SetNode();
bt->rchild=SetNode();
}
return bt;
}
void PostOrder(BiTree T, char x)
{
if(!T||T->node==x)
{
cout<<'0';
return ;
}
BiTNode *s[Maxsize]; //初始化栈
int top=-1;
BiTree p = T; //p为遍历指针
BiTree r = NULL; //r为辅组指针,指向最近访问过的结点。
while(p || top!=-1) //栈不空或p不空时循环
{
if(p) //一路向左
{
top++;
s[top]=p;
p = p->lchild; //左孩子不空,一直向左走
}
else //向右
{
p=s[top];//读栈顶结点(非出栈)
if(p->node == x) //如果栈顶结点的值等于x
{
top--;
while(top!=-1) //则将栈中所有元素依次出栈打印
{
p=s[top];
top--;
cout<<p->node; //访问该结点
}
return ; //执行完毕返回
}
if(p->rchild && p->rchild != r) //若右子树存在,且未被访问过
{
p = p->rchild; //转向右
top++;
s[top]=p;
p = p->lchild; //再走到最左
}
else //否则,弹出结点
{
p=s[top];
top--;
r = p; //记录最近访问过的结点
p = NULL; //结点访问完毕后,重置p指针,不然该结点又会重新入栈
}
}
}
if(top==-1)
{cout<<'0';return ;}
}