递归创建二叉树遇到的一个bug

今天上午在(先序)递归创建二叉树时遇到了一个bug,以下是程序部分:

(关于递归创建二叉树这位前辈讲的很清楚,http://blog.csdn.net/stpeace/article/details/8138303)

 1 void PreTraverse(PBiNode T)
 2 {
 3     if(!T)
 4         return;
 5     printf("%c", T->data);
 6     PreTraverse(T->leftch);
 7     PreTraverse(T->rightch);
 8 }
 9 void CreateBiTree(PBiNode &root)
10 {
11     char c;
12     scanf("%c", &c);
13     if(‘#‘ == c)
14         root = NULL;
15     else
16     {
17         root = (PBiNode)malloc(sizeof(PBiNode));
18         root->data = c;
19         CreateBiTree(root->leftch);
20         CreateBiTree(root->rightch);
21     }
22 }
23 int main(void)
24 {
25     PBiNode root;
26
27     CreateBiTree(root);
28     printf("PreOrderTra: ");
29     PreTraverse(root);
30     return 0;
31 }

  程序运行后一直没有输出前序遍历信息(确定前序遍历程序正确),起初以为是补充“#”(当作叶子节点)后没有按先序顺序输入,然后就输入了一个简单的“A##",程序仍然不能执行,百思不得其解。bug本身很简单,因为粗心导致的,不知道你有没有看出来?

  待到回头看到CreateBiTree函数体时,才恍然大悟,原来是else下面的那句malloc出错了,本应该为一个树节点开辟空间,却写成了为一个树节点指针(PBiNode)开辟空间了。实属粗心,谨记。

时间: 2024-10-09 01:41:45

递归创建二叉树遇到的一个bug的相关文章

非递归创建二叉树( C++队列 )

非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 front+1 回车表示结点输入完毕 1 // 结构体 2 struct Node { 3 char data; 4 Node * lchild; 5 Node * rchild; 6 }; 7 /* 类 class Tree中的私有构造方法 Node * Create() 8 注:该方法需要 以层序

递归创建二叉树

1. 树的存储 typedef struct BiTNode { char data; struct BiTNode lchild,rchild; }BTNode,*BTree; 2 .树的创建 void CreateTree(BTree &T) { char ch; cin>>ch; if(ch=='#') { T=NULL; } else { T=(BTree) new BTNode; if(!T) exit(-1); T->data=ch; CreateTree(T->

二叉树的递归创建

1.树 (1).树形结构本身具有递归的性质(在其后的编程中体现的淋漓尽致)! 树是一种非常重要的非线性结构. (2).几个概念:结点的度,就是分支个数(孩子个数): 树的度,结点度中最大的(孩子最多的): 非叶子结点,度 > 0 (有孩子结点): 叶子结点,度为0的 (没有孩子结点): 树的高度,从1开始算: (3).为什么要学习二叉树? 原因:所有的树形结构(包括森林)都可以转化为二叉树.二叉树是树形结构的基础, 只有学好了二叉树才能学好其它的. 2.二叉树 (1).二叉树分左右,所以又叫做有

c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

#include <iostream> #include <cstdio> #include <stdio.h> #include <string> #include <queue> #include <stack> using namespace std; class Node{ public : char data; struct Node *lchild,*rchild; }; class BiTree{ public: Nod

先序非递归建立二叉树

大二这么久了,第一个学期课程实在太少,而且全都不是CS的专业课,无奈,若是自己不勤奋一点,过了半年,用不到半年,就又变回小白了.所以自己最近也在重新巩固数据结构的知识.刚好看到二叉树这里,觉得二叉树应用广泛,复习的比较细致. 刚开始就是二叉树的建立了,大多数地方都是先序的递归创建,于是便想着试试非递归的代码,倒腾了个把小时,基本上弄出代码了,小女子水平有限,有错误的地方,望路过的大神不吝赐教~~不胜感激! 主要的思路是: 按照先序的顺序输入二叉树,若是遇到空子树,用字符‘#‘表示,例如 左图:A

数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<malloc.h> #define null 0 using namespace std; typedef struct node { int data;//节点 node *lchild,*rchild; }node,*Tree; typedef struct{ Tree to

非递归建立二叉树

前言 使用递归(Recursion)建立二叉树(Binary Tree)的非顺序存储结构(即二叉链表),可以简化算法编写的复杂程度,但是递归效率低,而且容易导致堆栈溢出,因而很有必要使用非递归算法. 引入 无论是单链表还是二叉树,创建时要解决问题就是关系的建立,即单链表中前驱节点与当前节点的关系和二叉树中父节点与子节点的关系. 首先,思考一下建立单链表的过程,为了使链表各个节点连接起来,在创建当前节点(q)的时候,需借助一个指针(p)指向前一个节点,然后p->next = q. 由此推广至二叉树

递归非递归的二叉树遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法.方法一:形式化模拟转换.方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法.而此次正好是利用第二种按方法求解. 1.1非递归前序遍历: 首先利用下图来设计非递归前序遍历算法思想: 堆栈结构体如下: #define size 100 typedef struct { DataType data[size]; int tag[100]; //这个是在非递归后序中用到 int top : }SeqStack : (1)初始化设置一个堆

先序创建二叉树

09 void CreateTree(BiTree *T) { 10 char ch; 11 scanf("%c",&ch); 12 if(ch == '#') { 13 *T = NULL; 14 return; 15 } 16 else { 17 *T = (BiTree)malloc(sizeof(BiTNode)); 18 if(*T== NULL) exit(-1); 19 (*T)->data = ch; 20 CreateTree(&(*T)->