ex4_1——基本题
1)二叉树结点类型定义为:
typedef struct bnode
{ int data;
struct bnode *lchild, *rchild;
}bnode_type;
2)编写二叉树的创建函数,可以是排序二叉树的创建思路(见教材),或者以先序遍历为框架。
3)编写中序遍历函数;
4)编写后序遍历函数;
5)编写先序遍历函数;
6)编写main()函数,先调用create函数,建立一颗二叉排序树;然后分别调用中序、后序、先序遍历函数,将二叉树的先序、中序和后序遍历序列输出到屏幕上。
ex4_2——扩展题
1)实现二叉排序树的插入函数
2)main函数中,输入一组无序数,调用二叉排序树插入算法,将元素放入二叉树中
3)中序遍历这颗二叉树,得到排序顺序。
ex4-3——扩展题
1)编写函数求一颗二叉树的深度
2)求一颗二叉排序树的排序的反序结果,即将二叉排序树每个节点的左右子树交换,然后中序遍历之。
#include<stdio.h>
#include<malloc.h>
typedef struct treenode{
int data;
struct treenode *lchild, *rchild;
}treenode,*root;
typedef struct node{
root data;
struct node *next;
}node,*stacklink;
int init(stacklink &S){
S=(stacklink)malloc(sizeof(node));
if(!S) return 0;
S->next=NULL;
return 1;
}
void push(stacklink &s,root e){
stacklink newnode;
newnode=(stacklink)malloc(sizeof(stacklink));
newnode->next=s;
newnode->data=e;
s=newnode;
}
int pop(stacklink &S,root &e){
stacklink p;
if(S->next==NULL) return 0;
p=S;
S=S->next;
e=p->data;
return 1;
}
void show(stacklink s){
printf("top to base:");
while(s->next!=NULL){
printf("%d ",s->data->data);
s=s->next;
}
printf("\n");
}
void tree_init(root &t){
t=(root)malloc(sizeof(treenode));
t->data=0;
t->lchild=NULL;
t->rchild=NULL;
}
void tree_insert(root &t,int e){
root q=t;
root p;
if((q->lchild==NULL)&&(q->lchild==NULL)&&(q->data==0)){
q->data=e;
return;
}
if(e>t->data){
if(t->rchild!=NULL){
q=q->rchild;
tree_insert(q,e);
}
if(t->rchild==NULL){
p=(root)malloc(sizeof(treenode));
p->data=e;
p->lchild=NULL;
p->rchild=NULL;
q->rchild=p;
}
}
if(e<=t->data){
if(t->lchild!=NULL){
q=q->lchild;
tree_insert(q,e);
}
if(t->lchild==NULL){
p=(root)malloc(sizeof(treenode));
p->data=e;
p->lchild=NULL;
p->rchild=NULL;
q->lchild=p;
}
}
}
void treemid(root t){
stacklink s;
root p=t;
int e;
printf("mid: ");
init(s);
while(p!=NULL||s->next!=NULL){
if(p!=NULL){
push(s,p);
p=p->lchild;
}else{
pop(s,p);
printf("%d ",p->data);
p=p->rchild;
}
}
printf("\n");
}
void treepre(root t){
stacklink s;
root p=t;
int e;
init(s);
printf("pre:");
while(p!=NULL||s->next!=NULL){
if(p!=NULL){
printf("%d ",p->data);
push(s,p);
p=p->lchild;
}else{
pop(s,p);
p=p->rchild;
}
}
printf("\n");
}
void treelast(root t){
stacklink s;
root q=NULL,p=t;
int e;
init(s);
printf("last:");
while(p!=NULL||s->next!=NULL){
if(p!=NULL){
push(s,p);
p=p->lchild;
}else{
pop(s,p);
if(p->rchild==NULL){
printf("%d ",p->data);
}else
push(s,p);
q=p;
p=p->rchild;
q->rchild=NULL;
}
}
printf("\n");
}
int max(int a,int b){
if(a>b)return a;
else return b;
}
int deep(root t){
if((t->lchild==NULL)&&(t->rchild==NULL))
return 1;
else{
if((t->lchild!=NULL)&&(t->rchild!=NULL)){
return max(deep(t->lchild),deep(t->rchild))+1;
}else if(t->lchild!=NULL){
return deep(t->lchild)+1;
}else if(t->rchild!=NULL)
return deep(t->rchild)+1;
}
}
void reversemid(root t){
stacklink s;
root p=t;
int e;
printf("reversemid: ");
init(s);
while(p!=NULL||s->next!=NULL){
if(p!=NULL){
push(s,p);
p=p->rchild;
}else{
pop(s,p);
printf("%d ",p->data);
p=p->lchild;
}
}
printf("\n");
}
void main(){
root t,t1;
int m=0;
int n,a,e=1;
printf("创建,end='0'\n");
tree_init(t);
tree_init(t1);
while(e!=0){
scanf("%d",&e);
if(e!=0){
tree_insert(t1,e);
tree_insert(t,e);
}
}
e=deep(t);
treemid(t);
treepre(t);
treelast(t1);
printf("deep=%d\n",e);
reversemid(t);
}