您的位置:首页 > 理论基础 > 数据结构算法

数据结构之二叉树建立

2014-09-23 13:54 239 查看
树上的笔记记的快满了,随转到博客记录一下。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息