赞
踩
#include<stdio.h> #include<malloc.h> #include<string.h> typedef char ElemType; typedef struct BiTNode{ ElemType data; //数据域 struct BiTNode *LChild,*RChild; //左右孩子指针 }BiTNode,*BiTree; //怎么把创建二叉树想明白:C语言的规则是要访问一个数只需要传值,只需要普通的参数传递;要修改一个数 //需要传地址,需要使用指针或者引用。最主要的一点是:创建和销毁二叉树,头结点针的内容都发生变化 //(变为NULL);所以,传参要传指针的地址。 最应该注意的一点就是创建头指针之前头指针是空的,如果 //使用了一级指针,就是创建了一个和头结点意义的空指针(头结点的副本),两个指针指的不是同一个内存单元 //而创建完之后,头结点仍然是空的。 而增删改的前提是已经创建了链表头结点,此时使用一级指针就是又增加 //了一个指针指向头结点,与头指针指向同一个头结点(即同一个链表),而不是又创建了一个二叉树。 //按照先序遍历序列创建二叉树 void CreateBiTree1(BiTree *bt) { // 使用指针的方式创建,bt指针的值是T1指针的地址 char ch; scanf("%c",&ch); if(ch=='#') *bt=NULL; else { *bt=(BiTree)malloc(sizeof(BiTNode)); // 生成一个新结点 (*bt)->data=ch; CreateBiTree1(&((*bt)->LChild)); // 生成左子树 CreateBiTree1(&((*bt)->RChild)); //生成右子树 } } void CreateBiTree2(BiTree &bt) {//使用引用的方式创建,bt和T2是同一个内存单元 char ch; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(BiTree)malloc(sizeof(BiTNode)); bt->data=ch; CreateBiTree2(bt->LChild); CreateBiTree2(bt->RChild); } } BiTree CreateBiTree3() { BiTree bt; char ch; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(BiTree)malloc(sizeof(BiTNode)); bt->data=ch; bt->LChild=CreateBiTree3(); bt->RChild=CreateBiTree3(); } return bt; } //按照中序遍历序列创建二叉树:不可行 //输出先序遍历后的二叉树序列 void PreOrder(BiTree T){ if(T!=NULL){ printf("%c",T->data); PreOrder(T->LChild); PreOrder(T->RChild); } } //销毁二叉树 void DestroyBiTree(BiTree &b) { if (b!=NULL) { DestroyBiTree(b->LChild); DestroyBiTree(b->RChild); free(b); } } int main(){ BiTree T1,T2,T3; CreateBiTree1(&T1);//ABD##E##CFH###G## PreOrder(T1); printf("\n"); DestroyBiTree(T1); // CreateBiTree2(T2); // PreOrder(T2); // printf("\n"); // DestroyBTree(T2); // T3=CreateBiTree3(); // PreOrder(T3); // printf("\n"); // DestroyBiTree(T3); //CreatBiTreeList(&T2);//A(B(D,E),C(F(H,),G)) return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。