二叉树-链表存储结构及其简单算法

适用于层次结构的数据(大部分算法用递归思想)

#include <stdio.h>
#define Max 100
结构体
typedef struct TNode{
	int data;
	struct Node * lchild;//左孩子结点
	struct Node * rchild;//右孩子节点
}TNode; 
//先序遍历(/根结点->左孩子->右孩子)
void preTrave(TNode* node){
	if(node!=NULL){
			printf("%d",node->data);
			preTrave(node->lchild);
			preTrave(node->rchild);
	}
}
//中序遍历(左孩子->根结点->右孩子)
void midTrave(TNode* node){
	if(node!=NULL){
		midTrave(node->lchild);
		printf("%d",node->data);
		midTrave(node->rchild);
	}
}
//后序遍历(左孩子->右孩子->根结点)
void lateTrave(TNode * node){
	if(node!=NULL){
		lateTrave(node->lchild);
		lateTrave(node->rchild);
		printf("%d",node->data;)
	}
}
//层序遍历(利用顺序(循环)队列的特性)
void cTrave(TNode *node){
		TNode * que[Max];//存放树结点
		int front,rear;
		front = rear = 0;//队列初始化
		TNode * s;
		if(node!=NULL){
			rear = (rear + 1)%Max;
			que[rear] = node;//根结点入队
			while(rear != front){//如果队不空
				front = (front+1) %Max;
				s = que[front];//根结点出队
				print("%d",s->data);
				if(s->lchild!=NULL){//如果左孩子不为空
					rear = (rear + 1)%Max;
					que[rear] = s->lchild;//左孩子结点入队
				}
				if(s->rchild!=NULL){//如果右孩子不为空
					rear = (rear +1)%Max;
					que[rear] = s->rchild;//右孩子入队
				}
			}
		}
}

//求宽度(利用顺序非循环的队列,增加一个结构体来存储结点指针以及结点所在的层次号)
typedef struct T{
	TNode * node;//结点指针
	int no;//结点所在层次号
}
int getWidth(TNode * node){
	T que[Max];
	int front,rear;//定义一个顺序非循环队列
	front = rear = 0;
	int i,j,n,max,Lno;
	TNode s;
	if(node!=NULL){
		++rear;
		que[rear].node = node;//根结点入队
		que[rear].no = 1;//根结点所在层次为1
		while(front!=rear){//如果队不空
			++front;
			s = que[front].node;//结点出队
			Lno = que[front].no;//关键一步:存储当前结点的层次号
			if(s->lchild!=NULL){//左孩子不空则将左孩子入队
				++rear;
				que[rear].node = s->lchild;
				que[rear].no = Lno+!;//关键一步:根据当前结点层次号计算其孩子结点层次号
			}
			if(s->rchild!=NULL){//如果右孩子不为空则将右孩子入队
				++rear;
				que[rear].node = s->rchild;
				que[rear].no = Lno+!;//关键一步:根据当前结点层次号计算其孩子结点层次号
			}
		}//循环结束,Lno中保存了这棵二叉树中最大的层数
		//以下代码找出含有结点最多的层中的结点数
		max = 0;
		for(i=0;i<=Lno;i++){
			n = 0;
			for(j=1;j<=rear;j++){
				if(que[j].no==i){
					++n;
				}
			}
			if(max<n){
				max = n;
			}
		}
		return max;
	}else{
		return 0;//空树直接返回0
	}
}

//求二叉树深度(递归)
int getDepth(TNode * node){
	int ld;rd;//用于接收左右深度
	if(node!=NULL){
		ld = getDepth(node->lchild);
		rd = getDepth(node->rchild);
		return (ld>rd?ld:rd)+1'
	}else{
		return 0;
	}
}
//求值为key的结点在二叉树中的位置
void getNo(TNode * root,int key,TNode ** node){
	if(root!=NULL){
		if(root->data == key){
			(*node) = root;
		}else{
			getNo(root->lchild,key,node);
			if(node!=NULL){
				getNO(root->rchild,key,node);
			}
		}
	}
}
//二叉树的创立(递归)
TNode * init(){
	int data;
	scanf("%d",&data);
	TNode * node = NULL;
	if(data!=-1){
		node = (TNode*)malloc(sizeof(TNode));
		node->data = data;//给树节点赋值
		root->lchild = init();//创建左孩子
		root->rchild = init();//创建右孩子
	}
	return node;
}
//二叉树的销毁(后序遍历思想)
void destory(TNode * node){
	if(node!=NULL){
		destory(node->lchild);
		destory(node->rchild);
		free(node);//释放结点
	}
}
//二叉排序树的插入(左孩子小右孩子大)
void insertNode(TNode ** node,int key){
	if(node!=NULL){//结点是否为空;不为空的比较大小插入
		if(key<(*node)->data){//比根结点小则在左边
			insertNode((*root)->lchild,key);
		}else{//比根结点大或者相等则在右边
			insetNode((*node)->rchild,key);
		}
	}else{//为空则新建结点
		(*root) = (TNode*)malloc(sizeof(TNode));
		(*root)->data =key;
	}
}
//在二叉排序树中查找某个结点
TNode * findNode(TNode * node,int key){
	if(node!=NULL){
		if(key==node->data){
			return node;
		}else if(key<node->data){
			findNode(node->lchild,key);
		}else{
			findNode(node->rchild,key);
		}
	}else{
		return NULL;
	}
}

//表达式(a-(b+c))*(d/e),编写程序求出该表达式的值(使用后序遍历)
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值