Problem Description
设有一二叉树,其节点值为字符型并假设各值互不相等,采用顺序存储结构存储,空二叉树用'#'表示。现要求设计一个算法,逆序输出从根到层序编号为i的结点的路径。如有一棵二叉树顺序存储为A#B###C#######D,则从根到层序编号为15的逆路径为DCBA。
Input
有多组数据,每组测试数据有两行,第一行为数组元素个数n(n<=50)和结点的层序编号m(m>0),第二行为数组各元素。
Output
若编号m所对应的结点有效,则逆序输出从根到该点的路径;若无效,则输出"data error"。
Sample Input
15 7 A#B###C#######D 13 5 ABC#DE###F##G
Sample Output
CBA DBA
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct BiNode {
char data;
struct BiNode* rchild,*lchild;
} BiNode,*BiTree;
void ToTree(BiTree& bt,char* str,int start,int len) {
if(str[start]=='#'||start>=len) {
bt=NULL;
} else {
bt=new BiNode;
bt->data=str[start];
ToTree(bt->lchild,str,start*2+1,len);
ToTree(bt->rchild,str,start*2+2,len);
}
}
void PreOrder(BiTree root) {
if(root) {
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
class Stack {
private:
int top;
char data[51];
public:
Stack() {
top=-1;
}
void Push(char ch) {
data[++top]=ch;
}
char Pop() {
if(top!=-1) {
return data[top--];
}
return '#';
}
void PrintStack() {
while(top!=-1) {
char ret=Pop();
cout<<ret;
}
cout<<endl;
}
};
void Path(BiTree bt,char ch,Stack& s) {
if(bt) {
s.Push(bt->data);
if(bt->data==ch) {
s.PrintStack();
} else {
Path(bt->lchild,ch,s);
Path(bt->rchild,ch,s);
}
s.Pop();
}
}
int main() {
int n,m;
while(cin>>n>>m) {
char str[51];
cin>>str;
char ch='#';
int len=strlen(str);
for(int i=0; i<len; i++) {
if(i==m-1) {
ch=str[i];
}
}
if(ch=='#') {
cout<<"data error"<<endl;
} else {
BiTree root;
ToTree(root,str,0,n);
Stack s;
Path(root,ch,s);
// PreOrder(root);
}
}
return 0;
}