//12.1-3 给出一个非递归的中序树遍历算法
#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 Node_Print(node *N)
{
//递归地访问其左孩子
if(N->left)
Node_Print(N->left);
//访问当前结点
cout<<N->key<<' ';
//递归地访问其右孩子
if(N->right)
Node_Print(N->right);
}
//遍历二叉树
void Tree_Print(tree *T)
{
//只孩子访问根结点,其它结点都在递归中访问了
Node_Print(T->root);
cout<<endl;
}
//把x结点压入栈S的顶部
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;
node *ret = &S[S[0].key];
S[0].key--;
return ret;
}
//用非递归的方式中序遍历二叉树
void Tree_Print2(tree *T)
{
//这种方式要借助一个栈来实现,栈的大小为树的深度
node Stack[15] = {0};//简单的数组栈,Stack[0]存储栈顶位置
node *t = T->root;
//当处理一个结点时,做如下处理
while(1)
{
//入栈
Push(Stack, *t);
//如果有左孩子,下一步处理其左孩子
if(t->left)
t = t->left;
//如果没有左孩子
else
{
do{
//弹出栈顶元素
t = Pop(Stack);
//若栈中元素已经全部弹出,那么二叉树访问结束了
if(t == NULL)
{
cout<<endl;
return;
}
//访问这个结点
cout<<t->key<<' ';
}
//如果这个栈顶元素没有右孩子,则继续出栈,直到访问结束或找到一个有右孩子的元素
while(t->right == NULL);
//如果这个栈顶元素有右孩子,则访问其右孩子
t = t->right;
}
}
}
/*input:0=NIL
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
*/
int main()
{
int i;
node A[11];
for(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];
Tree_Print2(T);
return 0;
}
算法导论12.1-3答案
最新推荐文章于 2021-12-20 16:19:17 发布