数据结构之二叉树建立

来源:互联网 发布:淘宝香港代购可靠吗 编辑:程序博客网 时间:2024/06/10 00:40

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


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 1typedef 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;}



0 0