二叉树--链表结构

 综合一位网友csdn,另外结合《大话数据结构》;

其中我对递归的理解也注释在一边。

可惜本程序是运行不起来的。但是大话数据结构的代码能够跑起来,但没必要纠结这个,掌握核心就行

 
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"

#define MAXSIZE 100
typedef int Status;
typedef char TElemType;
typedef char String[30];//0号存放数组长度

String StrT;//作为输入数组
int pos=1;
TElemType Nil=' ';

typedef struct BiLTNode  //节点结构 
{
	TElemType data;
	struct BiLTNode *lchild,*rchild;
}BiLTNode,*BiLTree;

Status InitBiLTree(BiLTree *T)
{
	//对二叉树初始化
	*T=NULL;
	return 1;
}

Status Visit(TElemType e)
{
	//打印节点
	printf("%d",e);
	return 1;
}

/ *构造二叉树* /  

//构造二叉树的工具函数,其会生成一个数组,
//作为CreateBiLTree()的输入,当然  
//也可以人为输入,但是为方便对二叉树的后续操作
//这里就简化了,将输入固定。

Status StrAssign(String StrT,char *s)
{
	int i;
	int j;
	j=strlen(s);
	if (j>MAXSIZE)
		return 0;

	else{
		StrT[0]=j;
		for (i=1;i<=j;i++){
			StrT[i]=*(s+i-1);
		}

		return 1;
	}
}

//创建二叉树:这里用先序遍历创建,并且此代码只能通
//过先序遍历方式创建,  
//想通过更改else中得遍历顺序来创建中序遍历和后序遍历
//的二叉树是不行的,因为无法创建根节点,这是
//《大话数据结构》中的错误  

Status CreateBiLTree(BiLTree *T)
{
	TElemType ch;
	if(*T==NULL)
		return 0 ;
	
	ch=StrT[pos++];

	if (ch=='#')
		*T=NULL;
	else	
	{
		*T=malloc(sizeof(struct BiLTNode));

		if (*T==NULL)
		{
			exit(1);
		}
		else	
		{
			(*T)->data=ch;
			CreateBiLTree(&(*T)->lchild);
			CreateBiLTree(&(*T)->rchild);

			return 1;
		}
	}
}
/ *构造二叉树完毕* /  

Status DestroyBiLTree(BiLTree *T)
{
	if (*T==NULL)
		return 0;

	if ((*T)->lchild)
		DestroyBiLTree(&(*T)->lchild);

	if ((*T)->rchild)
		DestroyBiLTree(&(*T)->rchild);

	free(*T);
	//释放内存空间,但*T这个变量还在.为避免*T误用,则需要*T=NULL;  
	//free与malloc连用,其针对的是具体的*T所指的存储空间,而  
    // *T=NULL针对的是指针变量  
	*T=NULL;
	return 1;
}

int DepthBiLTree(BiLTree *T)
{
	int ldepth,rdepth;
	if (*T==NULL)
		return 0;

	if (!(*T)->lchild&&!(*T)->rchild)
		return 1;

	else{

		ldepth=DepthBiLTree(&(*T)->lchild);
		rdepth=DepthBiLTree(&(*T)->rchild);

		return (ldepth>rdepth?ldepth:rdepth)+1;

		//这里要加1操作.假设深度为2,  
		//而走到这步说明*T有孩子,  
		//则至少有*T和*T的孩子,所以深度返回值为2.  
        //另外,ldepth和rdepth相等,则返回相等的值

//我不这么理解,我现在对递归这么理解,任何需要用到递归的
//的地方,我只当成两层,以方便使用,开头判断一次,最后调用
//一次。对于此处求解深度,我开头判断是否只有根节点,然后求解左边深度,再
//再求解右边深度,最后+1

	}
}

TElemType Root(BiLTree *T)
{
	if (*T==NULL)
		return Nil;

	return (*T)->data;
}


void PreOrderTraverse(BiLTree *T)
{
	if(*T==NULL)
		exit(1);
	Visit((*T)->data);
	PreOrderTraverse(&(*T)->lchild);
	PreOrderTraverse(&(*T)->rchild);
}

void InOrderTraverse(BiLTree *T)
{
	if ((*T)==NULL)
		exit(1);

	InOrderTraverse(&(*T)->lchild);
	Visit((*T)->data);
	InOrderTraverse(&(*T)->rchild);
}

void PostOrderTraver(BiLTree *T)
{
	if ((*T)==NULL)
		exit(1);

	PostOrderTraver(&(*T)->lchild);
	PostOrderTraver(&(*T)->rchild);
	Visit((*T)->data);
}
int main()
{
	char *chars = "ABCD#K###E##CFI###G#J##";//全局变量  
    StrAssign(StrT,chars); 
    BiLTree *T;//T是双重指针
	 
    T = (BiLTree *)malloc(sizeof(BiLTree));  
    InitBiLTree(T);  
    CreateBiLTree(T);  
    printf("构造二叉树后,二叉树是否为空(1:是,0:不是)? %d\n",EmptyBiLTree(T));  
    printf("二叉树的深度为 %d\n",DepthBiLTree(T));  
    printf("二叉树的根为:%c\n",Root(T));  
	
    printf("前序递归遍历:");  
    PreOrderTraverse(T);  
    printf("\n");  
	
    printf("中序递归遍历:");  
    InOrderTraverse(T);  
    printf("\n");  
	
    printf("后序递归遍历:");  
    PostOrderTraverse(T);  
    printf("\n");  
	
    //销毁树  
    DestoryBiLTree(T);  
    printf("构造二叉树后,二叉树是否为空(1:是,0:不是)? %d\n",EmptyBiLTree(T)); 
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值