#include "iostream"
using namespace std;
struct node {
int key;
node* left;
node* right;
node(){}
node(int x):key(x),left(NULL),right(NULL){}
};
struct Tree {
node* root;
Tree():root(NULL){}
};
void push(node* S,node x)
{
S[0].key++;
S[S[0].key]=x;
}
node* pop(node* S)
{
if (S[0].key==0) {
return NULL;
}
S[0].key--;
return &S[S[0].key+1];
}
void print_tree(Tree* T)
{
node stack[20]={0};
node* t=T->root;
while (1) {
//如果有节点,则一直往下输出所有的最左边的结点,同时用栈保存所有的结点
cout<<t->key<<' ';
push(stack,*t);
if (t->left) {
t=t->left;
}
else
{
do{
//如果结点的右孩子不存在,则一直弹栈,测试上一个结点,
//直到找到一个结点,它的右孩子存在为止,则将指针指向它的右孩子,重复外循环
t=pop(stack);
if (t==NULL) {
return;
}
}
while (t->right==NULL) ;
t=t->right;
}
}
}
void main()
{
node A[11];
for(int i=1;i<=10;i++)
{
int key,left,right;
cin>>key>>left>>right;
A[i].key=key;
if (left) {
A[i].left=&A[left];
}
else
A[i].left=NULL;
if (right) {
A[i].right=&A[right];
}
else
A[i].right=NULL;
}
Tree* T=new Tree();
T->root=&A[6];
print_tree(T);
}
输入用算法导论10.4-1的属性表构造二叉树
12 7 3
15 8 0
4 10 0
10 5 9
2 0 0
18 1 4
7 0 0
14 6 2
21 0 0
5 0 0