数据结构中二叉树的的存储、遍历、交换子树、统计二叉树的深度

要求:二叉树以lson-rson链接方式存储,以菜单方式设计并完成功能任务:建立并存储树、输出前序遍历结果、输出中序遍历结果、输出后序遍历结果、交换左右子树、统计高度,其中对于中序、后序的遍历运算要求采用非递归方式。代码利用C语言描述。

//时间:2015.6.1

//编程环境:win7-64,codeblocks,GUN-GCC编译器

#include<stdio.h>

#include<stdlib.h>
struct Node *T;//声明全局变量T

struct Node//建立结点
{
struct Node*lson;
char data;
struct Node*rson;
};



struct Node * CreatTree(struct Node*T)//二叉树的建立
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
T=NULL;
}
else
{
T=(struct Node*)malloc(sizeof(struct Node));
if(!T)
exit(1);//溢出错误
T->data=ch;
T->lson=CreatTree(T->lson);
T->rson=CreatTree(T->rson);
}
return T;

}

void PreorderTraverse(struct Node *T)//递归前序遍历
{
if(T==NULL)
return;
else
{
printf("%c ",T->data);
PreorderTraverse(T->lson);
PreorderTraverse(T->rson);
}

}

void InOrder(struct Node* T)//非递归中序遍历
{
struct Node *stack[10], *p;
int top = -1;
if (T!= NULL)
{
p = T;
while (top > -1 || p != NULL)
{
// 扫描p的所有左节点并入栈
while (p != NULL)
{
top++;
stack[top] = p;
p = p->lson;
}
if (top > -1)
{
// 出栈并访问该节点
p = stack[top];
top--;
printf("%c ", p->data);
//扫描p的右孩子 */
p = p->rson;
}
}
printf("\n");
}
}

// 非递归后序遍历二叉树
void PostOrder(struct Node* T)
{
struct Node *stack[10], *p;
int sign, top = -1;
if (T != NULL)
{
do
{
//T所有左节点入栈
while (T != NULL)
{
top++;
stack[top] = T;
T = T->lson;
}
//p指向栈顶前一个已访问节点
p = NULL;
// 置T为已访问
sign = 1;
while (top != -1 && sign)
{
// 取出栈顶节点
T = stack[top];
//右孩子不存在或右孩子已访问则访问T
if (T->rson == p)
{
printf("%c ", T->data);
top--;
//p指向被访问的节点
p = T;
}
else
{
// T指向右孩子节点
T = T->rson;
//置未访问标记
sign = 0;
}
}
}while (top != -1);
printf("\n");
}
}


void exchange(struct Node*T)//交换左右子树
{
if(T==NULL)
return;
struct Node *x;
x=T->lson;
T->lson=T->rson;
T->rson=x;//完成交换过程
exchange(T->lson);
exchange(T->rson);
}

int high(struct Node *T)
{
int lh, rh;
if(T==NULL)
return 0;
else
{
lh=high(T->lson);
rh=high(T->rson);
if(lh>rh)
return lh+1;
else
return rh+1;
}


}

void UI()//用户界面
{
printf("\n\n\n\n");
printf("**************************************************************\n");
printf("* *\n");
printf("* 请选择菜单功能选项前的序号 *\n");
printf("* *\n");
printf("**************************************************************\n");
printf("1.建立并存储树\n2.输出前序遍历结果\n3.输出中序遍历结果\n");
printf("4.输出后序遍历结果\n5.交换左右子树\n6.统计高度\n7.退出程序\n\n\n");
printf("请选择输入1-7\n");

}


void menu()//菜单
{
UI();
int c;
char b;//用于读取输入过程中的回车符
while (1)
{
scanf("%d",&c);
if(c==7)
break;
switch(c)
{
case 1:
printf("你选择的是 1.建立并存储树\n请以前序遍历的顺序输入:\n");
scanf("%c",&b);
T=CreatTree(T);
printf("\n二叉树已经建立并存储完成\n");
UI();
break;

case 2:
printf("你选择的是 2.输出前序遍历结果\n");
scanf("%c",&b);
PreorderTraverse(T);
UI();
break;

case 3:
printf("你选择的是 3.输出中序遍历结果\n");
InOrder(T);
UI();
break;

case 4:
printf("你选择的是 4.输出后序遍历结果\n");
PostOrder(T);
UI();
break;

case 5:
printf("您选择的是 5.交换左右子树\n");
scanf("%c",&b);
exchange(T);
printf("\n已经完成了二叉树左右子树的交换\n");
UI();
break;

case 6:
printf("您的选择是 6.求二叉树的高度\n");
int h=high(T);
printf("二叉树的高度是%d\n",h);
UI();
break;
}
}
}
int main()
{
menu();
}
 

来源:心倾城的网易博客

欢迎分享本文,转载请保留出处!

发布了29 篇原创文章 · 获赞 43 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/xiaoyuge16/article/details/51362332