初学者。如果有误请指正,欢迎联系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;
}