数据结构之二叉树建立

树上的笔记记的快满了,随转到博客记录一下。


void CreateBiTree(BiTree *T)
{

	TElemType ch;

	scanf("%c",&ch);
	
	if(ch=='#')      //#代表这个节点没有子树。
		*T=NULL;
	else
	{
		*T=(BiTree)malloc(sizeof(BiTNode));          //malloc生成一个内存空间并且强制转化为BiTree类型,类似new的作用。生成一个根节点的内存空间。
		if(!*T)
			exit(OVERFLOW);
		(*T)->data=ch; /* 生成根结点的值 */
		CreateBiTree(&(*T)->lchild); /* 构造左子树 */
		CreateBiTree(&(*T)->rchild); /* 构造右子树 */      //函数参数的传递是单向值传递,当我们是需要改变一个指针的值时,就需要用二重指针做参。
		                                                  //如果我们只传递进去一个一个指向节点的指针,调用结束后,这个指针的值是不会改变的。
	}
}

1.这个方法建立的二叉树是一棵扩展二叉树。每一个节点的左右子树都表示出来,没有的用#表示。

2.这个方法是按前序遍历的方法建立的。所以输入的节点也必须是按照前序遍历的顺序输入的。所以遍历树的方法和建立树的方法是紧密相关的。

3.据作者博客称,中序遍历是无法建立二叉树的,后续遍历也需要满足一定的条件才能建立二叉树。

4.关于方法参数使用二重指针,从整段代码来看,对二叉树的使用,主要是通过调用一个指向根节点的指针来实现的。因为函数传参是单向值传递,所以想改变指针的值的话,则必须传递二重指针才行

5.整段代码中,对二叉树的使用和创建,主要是通过调用一个指向根节点的指针来实现的。

6.整棵树的建立是通过递归来实现的。


附整段代码:

#include <stdio.h>
#include <stdlib.h>
#include "math.h"

#define OK 1

typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef char TElemType;

typedef struct BiTNode  /* 结点结构 */
{
   TElemType data;		/* 结点数据 */
   struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;


/* 构造空二叉树T */
Status InitBiTree(BiTree *T)
{
	*T=NULL;
	return OK;
}

/* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
void DestroyBiTree(BiTree *T)
{
	if(*T)
	{
		if((*T)->lchild) /* 有左孩子 */
			DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
		if((*T)->rchild) /* 有右孩子 */
			DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */
		free(*T); /* 释放根结点 */
		*T=NULL; /* 空指针赋0 */
	}
}

/* 按前序输入二叉树中结点的值(一个字符) */
/* #表示空树,构造二叉链表表示二叉树T。 */
void CreateBiTree(BiTree *T)
{
	TElemType ch;

	scanf("%c",&ch);

	if(ch=='#')      //#代表这个节点没有子树。
		*T=NULL;
	else
	{
		*T=(BiTree)malloc(sizeof(BiTNode));          //malloc生成一个内存空间并且强制转化为BiTree类型,类似new的作用。
		if(!*T)
			exit(OVERFLOW);
		(*T)->data=ch; /* 生成根结点 */
		CreateBiTree(&(*T)->lchild); /* 构造左子树 */
		CreateBiTree(&(*T)->rchild); /* 构造右子树 */      //函数参数的传递是单向值传递,当我们是需要改变一个指针的值时,就需要用二重指针做参。
		                                                  //如果我们只传递进去一个一个指向节点的指针,调用结束后,这个指针的值是不会改变的。
	}
}

//前序遍历
void PreOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
	PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
	PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}

int main()
{
	BiTree T;
	InitBiTree(&T);
	CreateBiTree(&T);
	PreOrderTraverse(T);
	return 0;
}



  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值