题目:二叉树的遍历
二叉树以lson-rson链接方式存储,以菜单方式设计并完成功能任务:建立并存储树、输出前序遍历结果、输出中序遍历结果、输出后序遍历结果、交换左右子树、统计高度,其中对于中序、后序的遍历运算要求采用非递归方式。
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
char data;
struct Node* left;
struct Node* right;
}Node;
//交互式创建二叉树
Node* QandA_Build(int isRoot){
Node *p;
char ch,ch2;
if (isRoot)
printf("请输入根结点: ");
scanf("%c", &ch);
ch2 = getchar();
if(ch == '#') p = NULL;
else{
isRoot = 0;
p = (Node*)malloc(sizeof(Node));
p->data = ch;
printf("请输入'%c'的左孩子: ", p->data);
p->left = QandA_Build(isRoot);
printf("请输入'%c'的右孩子: ", p->data);
p->right = QandA_Build(isRoot);
}
return p;
}
//先序序列创建二叉树
Node* PreOrder_Build(){
Node *p;
char ch;
scanf("%c", &ch);
if (ch == '#') p = NULL;
else{
p = (Node*)malloc(sizeof(Node));
p->data = ch;
p->left = PreOrder_Build();
p->right = PreOrder_Build();
}
return p;
}
//先序遍历(递归)
void PreOrder(Node* t){
if(!t)
return ;
else{
printf("%c",t->data);
PostOrder(t->left);
PostOrder(t->right);
}
}
//中序遍历(递归)
void InOrder(Node* t){
if(!t)
return ;
else{
InOrder(t->left);
printf("%c",t->data);
InOrder(t->right);
}
}
//后序遍历(递归)
void PostOrder(Node* t){
if(!t)
return ;
else{
PostOrder(t->left);
PostOrder(t->right);
printf("%c",t->data);
}
}
//中序遍历(非递归)
void InOrderByStack(Node* t){
if (t == NULL)
return;
Node* stack[100];
int top = -1;
Node* p = t;
while ( top!=-1 || p ){
//走到最左边,把走过的结点入栈
while(p){
top++;
stack[top] = p;
p = p->left;
}
//栈非空,出栈
if ( top!=-1 ){
p = stack[top];
top--;
printf("%c",p->data);
p = p->right;
}
}
}
//后序遍历(非递归)
void PostOrderByStack(Node* t){
if (t == NULL)
return;
Node* stack[100];
int top = -1;
Node* pCur = t, *pLastVisit = NULL;
//走到最左边
while (pCur){
top++;
stack[top] = pCur;
pCur = pCur->left;
}
while ( top!=-1 ){
//栈非空,则出栈
pCur = stack[top];
top--;
//右边为空 或 右边已被访问,打印
if (pCur->right == NULL || pCur->right == pLastVisit){
printf("%c", pCur->data);
pLastVisit = pCur;
}
else{//右边未被访问
top++;
stack[top] = pCur;
pCur = pCur->right;
while (pCur){
top++;
stack[top] = pCur;
pCur = pCur->left;
}
}
}
printf("\n");
}
//交换左右子树
void Exchange(Node* t){
Node *temp;
if(!t)
return ;
else{
temp = t->left;
t->left = t->right;
t->right = temp;
Exchange(t->left);
Exchange(t->right);
}
}
//统计二叉树高度
int Height(Node* t){
if(t==NULL)
return 0;
else if(t->left==NULL && t->right==NULL)
return 1;
else
{
int Hl,Hr;
Hl=Height(t->left);
Hr=Height(t->right);
if(Hl>Hr)
return Hl+1;
else
return Hr+1;
}
}
//创建二叉树菜单
Node* BuildTree(){
printf("* 欢迎来到二叉树系统,让我们先创建一棵二叉树吧!( òωó)");
int select, flag = 0;
char ch;
Node* tree;
while(!flag){
printf("\n* 1>交互式创建\n* 2>先序序列创建");
printf("\n* 请选择创建二叉树的方式:");
scanf("%d", &select);
ch = getchar();
printf("\n");
switch(select){
case 1:
printf("请按提示输入结点(空子树则输入'#')。\n");
tree = QandA_Build(1);
printf("* 创建成功!\n");
flag = 1;
break;
case 2:
printf("* 请输入先序序列(空子树则输入'#'):");
tree = PreOrder_Build();
printf("* 创建成功!\n");
flag = 1;
break;
default:
printf("* 输入错误!请重新输入!\n");
break;
}
}
return tree;
}
//二叉树功能菜单
int main(){
int select;
Node *tree = BuildTree();
while(1){
printf("\n*******欢迎来到二叉树系统******");
printf("\n***-----1>输出前序遍历------***");
printf("\n***-----2>输出中序遍历------***");
printf("\n***-----3>输出后序遍历------***");
printf("\n***-----4>交换左右子树------***");
printf("\n***-----5>统计二叉树高度----***");
printf("\n***-----6>重新创建二叉树----***");
printf("\n***-----7>退出系统----------***");
printf("\n*******************************");
printf("\n* 请输入数字:");
scanf("%d",&select);
printf("\n");
switch(select){
case 1:
printf("* 先序遍历为:");
PreOrder(tree);
printf("\n");
break;
case 2:
printf("* 中序遍历为:");
InOrderByStack(tree);
printf("\n* (递归)中序遍历为:");
InOrder(tree);
printf("\n");
break;
case 3:
printf("* 后序遍历为:");
PostOrderByStack(tree);
printf("\n* (递归)后序遍历为:");
PostOrder(tree);
printf("\n");
break;
case 4:
Exchange(tree);
printf("* 交换成功!\n");
break;
case 5:
printf("* 该二叉树的高度为:%d\n", Height(tree));
break;
case 6:
tree = BuildTree();
break;
case 7:
printf("* 再见!欢迎下次使用本系统!");
return 0;
default:
printf("* 输入错误!请重新输入!\n");
break;
}
}
}
参考资料
(强烈建议阅读及观看!)
二叉树的建立方法总结
【数据结构】细致讲解-二叉树(P3_二叉树的非递归遍历方式 )
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。