二叉链表

初学者。如果有误请指正,欢迎联系QQ2684162190

/*对树进行初始化是采用前序输入#代表节点为空**/
//推荐输入ab#c##d## 
#include<stdio.h>
#include<stdlib.h>
#define TElemType char

typedef struct BiTNode
{
	TElemType date;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//按照前序遍历输入二叉树中节点的值
//#表示空树构造二叉树链表表示二叉树T 
void CreatBiTree(BiTree *T)
{
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#')
		*T=NULL;
	else
	{
		*T = (BiTree)malloc(sizeof(BiTNode));
		if(!*T)
			exit(0);
		(*T)->date=ch;
		CreatBiTree(&(*T)->lchild);
		CreatBiTree(&(*T)->rchild);
	}
}
void PreOrderTraverse(BiTree T)
{
	if(T == NULL)
		return ;
	printf("%c ",T->date);
	PreOrderTraverse(T->lchild);
	PreOrderTraverse(T->rchild);
}
//中序遍历链表 
void PreOrderTraverse1(BiTree T)
{
	if(T == NULL)
		return ;
	PreOrderTraverse1(T->lchild);
	printf("%c ",T->date);
	PreOrderTraverse1(T->rchild);
}
// 后序遍历链表
void PreOrderTraverse2(BiTree T)
{
	if(T == NULL)
		return ;
	PreOrderTraverse1(T->lchild);
	PreOrderTraverse1(T->rchild);
	printf("%c ",T->date);
}
//销毁树 
void DestoryTree(BiTree *T)
{
	if(*T == NULL)
		return ;
	DestoryTree(&(*T)->lchild);
	DestoryTree(&(*T)->rchild);
	free(*T);
}
//将树清空 
void ClearTree(BiTree *T)
{
	if(*T == NULL)
		return ;
	(*T)->date = '#';
	ClearTree(&(*T)->lchild);
	ClearTree(&(*T)->rchild);
}
//若树为空返回1,否则返回0 
int TreeEmpty(BiTree T)
{
	if(T == NULL)
		return 1;
	return 0;
}
//返回T的深度 
int TreeDepth(BiTree T)
{
	int rdeep=0;
	int ldeep=0;
	if(T==NULL)
		return 0;
	if(T->lchild!=NULL)
		ldeep = TreeDepth(T->lchild);
	else
		ldeep = 0;
	if(T->rchild!=NULL)
		rdeep = TreeDepth(T->rchild);
	else
		rdeep = 0;
	return (rdeep>=ldeep) ? rdeep+1 : ldeep+1;
}
//返回树的根节点
char Root(BiTree T)
{
	if(T == NULL)
		return '0';
	else
		return T->date;
}
//cur_e是树中的一个节点用E返回cur_e的值 
void Value(BiTree T,BiTree cur_e,char *e)
{
	if(T == NULL)
		return ;
	if(T == cur_e)
		*e=T->date;
	Value(T->lchild,cur_e,e);
	Value(T->rchild,cur_e,e);
}
//给cur_e节点赋值为value 
void Assign(BiTree T,BiTree cur_e,char value)
{
	if(T==NULL)
		return ;
	if(T == cur_e)
		T->date = value;
	Assign(T->lchild,cur_e,value);
	Assign(T->rchild,cur_e,value);
}
//若Cur_r是树T的非根节点,则返回他的双亲,否则返回空 
void Parent(BiTree T,BiTree cur_e,BiTree *cure)
{
	if(T==NULL)
		return ;
	if(T->lchild!=cur_e&&T->rchild!=cur_e)
	{
		Parent(T->lchild,cur_e,cure);
		Parent(T->rchild,cur_e,cure);
	}
	if(T->lchild==cur_e||T->rchild==cur_e)
		*cure = T;
}
//求他的左孩子 
void LeftChild(BiTree T,BiTree cur_e,BiTree *cure)
{
	if(T==NULL)
		return ;
	if( T != cur_e)
	{
		LeftChild(T->lchild,cur_e,cure);
		LeftChild(T->rchild,cur_e,cure); 
	}
	if(T->lchild!=NULL&&T == cur_e)
		*cure = T->lchild;
	return ;
}
//求他的右兄弟 
void RightSibling(BiTree T,BiTree cur_e,BiTree *cure)
{
	if(T==NULL)
		return ;
	if( T->lchild != cur_e)
	{
		LeftChild(T->lchild,cur_e,cure);
		LeftChild(T->rchild,cur_e,cure); 
	}
	if(T->rchild!=NULL&&T->lchild == cur_e)
		*cure = T->rchild;
	return ;
} 
int main()
{
	BiTree T;
	CreatBiTree(&T);
	PreOrderTraverse(T);
	if(TreeEmpty(T))
		printf("树为空");
	else
		printf("树不为空");
	
	printf("\n树的深度为%d",TreeDepth(T));
	if(Root(T)=='0')
		printf("\n树是空树");
	else
		printf("\n树的根节点为%c",Root(T));
	
	BiTree cur_e;
	cur_e = T->lchild;
	char e;
	Value(T,cur_e,&e);
	printf("\ncur_e节点的值为%c",e);
	
	getchar(); 
	printf("\n输入value的值");
	scanf("%c",&e);	
	Assign(T,cur_e,e);
	PreOrderTraverse(T);
		
	BiTree cure=NULL;
	Parent(T,cur_e,&cure);
	if(cure)
		printf("\ncur_e的双亲点为%c",cure->date);
	else
		printf("\ncur_e为根节点");
	
	cure=NULL;
	LeftChild(T,cur_e,&cure);
	if(cure)
		printf("\ncur_e的左孩子为%c",cure->date);
	else
		printf("\ncur_e为叶节点或者cure无左孩子");
	
	
	cure=NULL;
	RightSibling(T,cur_e,&cure);
	if(cure)
		printf("\ncur_e的有右兄弟为%c",cure->date);
	else
		printf("\ncur_e无右兄弟");
			
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值