数据结构——二叉树

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); 
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值