C语言创建二叉树过程中遇到的一些问题
来源:互联网 发布:js 将数组变为字符串 编辑:程序博客网 时间:2024/06/06 12:40
其实这些问题以前也遇到过,不过没总结,遇到又要搞段时间,现在总结下。
比如我们要创建颗如下二叉树,按前序输入,则为AB#D##C##:
开始代码写成下面这样:
#define TElemType chartypedef struct BiTNode {TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree; void CreateBiTree(BiTree T) {TElemType ch;scanf("%c",&ch);if(ch == '#') {T = NULL;} else {T = (BiTree)malloc(sizeof(BiTNode));T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);return T;}}
其实这种错误和下面这种a,b无法被交换本质上是一样的,只是int类型变成了结构体指针类型:
#include<stdio.h>void swap(int a,int b) {int temp = a;a = b;b = temp;}int main() {int a = 3,b = 4;swap(a,b);printf("%d %d\n",a,b);}
所以类比两个数交换时的处理方式,自然可以想到用下面这种方式来处理:
void CreateBiTree(BiTree *T) {TElemType ch;scanf("%c",&ch);if(ch == '#') {*T = NULL;} else {*T = (BiTree)malloc(sizeof(BiTNode));(*T)->data = ch;CreateBiTree(&(*T)->lchild);CreateBiTree(&(*T)->rchild);}}
就是不是传结构体指针的值,而是传结构体指针的指针。
指针的指针不好理解,还有一种处理方式如下所示:
BiTree CreateBiTree() {TElemType ch;scanf("%c",&ch);if(ch == '#') {return NULL; } else {BiTree T = (BiTree)malloc(sizeof(BiTNode));T->data = ch;T->lchild = CreateBiTree(); T->rchild = CreateBiTree();return T;}}
我开始写的程序就错在在递归调用的时候没有将返回值赋值给父节点的左右孩子。
最后给个正确的完整代码,并用前序遍历输出了构造的二叉树:
#include<stdio.h>#include<stdlib.h>#define TElemType chartypedef struct BiTNode {TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree; BiTree CreateBiTree() {TElemType ch;scanf("%c",&ch);if(ch == '#') {return NULL; } else {BiTree T = (BiTree)malloc(sizeof(BiTNode));T->data = ch;T->lchild = CreateBiTree(); T->rchild = CreateBiTree();return T;}}void traverse(BiTree r) {if(r == NULL) {return;}printf("%c",r->data);traverse(r->lchild);traverse(r->rchild);}int main() {BiTree root;root = CreateBiTree();traverse(root);printf("\n");}
如果你要用指针的指针来构建的话完整代码如下:
#include<stdio.h>#include<stdlib.h>#define TElemType chartypedef struct BiTNode {TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree; void CreateBiTree(BiTree *T) {TElemType ch;scanf("%c",&ch);if(ch == '#') {*T = NULL;} else {*T = (BiTree)malloc(sizeof(BiTNode));(*T)->data = ch;CreateBiTree(&(*T)->lchild);CreateBiTree(&(*T)->rchild);}}void traverse(BiTree r) {if(r == NULL) {return;}printf("%c",r->data);traverse(r->lchild);traverse(r->rchild);}int main() {BiTree root;CreateBiTree(&root);traverse(root);printf("\n");}
2 0
- C语言创建二叉树过程中遇到的一些问题
- C语言中遇到的一些问题
- C语言学习过程中遇到的一些问题——already define in *.obj
- VS2005中遇到一些C语言不兼容的问题
- C语言使用过程中遇到的问题
- 开发过程中遇到的一些问题
- 项目过程中遇到的一些问题
- 学习JAVA语言过程中遇到了一些问题
- c++(c语言)编程过程中遇到的细微问题总结(持续更新)
- C语言中遇到的两个问题!
- c语言中遇到的问题
- c语言学习中遇到的问题
- c语言复习中遇到的问题
- c语言的二叉树的创建
- C语言二叉树的创建
- 调试STM32过程中遇到的问题总结(持续更新)--KEIL4+C语言
- 二叉树中遇到的问题
- 一些学习单片机和C语言遇到的问题
- layoutSubviews总结
- UUId与keychain
- PCL库和C++2011兼容问题
- 锐捷认证成功但是无法上网的问题
- JMeter使用总结
- C语言创建二叉树过程中遇到的一些问题
- Linux:多个 jdk 的安装和管理 update-alternatives , 或 alternatives
- 迷宫问题
- 鲁迅:《在酒楼上》
- iOS开发 UICollectionView详解+实例
- 关于android中sharedpreferences数据不更新的问题
- RVM(Ruby Version Manager)安装和使用
- Android Studio 快捷键
- 欢迎使用CSDN-markdown编辑器