// 先序创建二叉树 int creatBTTree(btNode** tree, char* str, int n) { char ch = str[n]; printf("%d %c\n", n, ch); n += 1; if (ch != '\0') { if (ch == '#') { *tree = NULL; } else { (*tree) = (btNode*) malloc(sizeof(btNode)); if (*tree = NULL) { printf("创建失败\n"); exit(0); } (*tree)->data = ch; n = creatBTTree(&((*tree)->rChild), str, n); n = creatBTTree(&((*tree)->lChild), str, n); } } return n; } void printTree(btNode* tree) { if (tree == NULL) { printf("#"); } else { printf("%c", tree->data); printTree(tree->lChild); printTree(tree->rChild); } } int main(void) { char* str = "ABC##DE#G##F###"; btNode* tree = NULL; creatBTTree(&tree, str, 0); printTree(tree); return 0; }这段代码有什么问题?
时间: 2024-01-18 20:03:45 浏览: 62
在代码中存在一个错误,即在判断节点是否创建成功时,使用了单等号(=)而不是双等号(==)。具体来说,在以下代码中:
```
(*tree) = (btNode*) malloc(sizeof(btNode));
if (*tree = NULL)
```
应该将其中的 `*tree = NULL` 改为 `*tree == NULL`,即改为双等号。这是因为单等号是赋值操作符,会将 NULL 赋值给 `*tree`,而双等号才是相等判断操作符。这个错误会导致节点的创建失败,进而导致程序出现异常。
相关问题
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode { char data; // 节点数据 struct TreeNode* left; // 左子树指针 struct TreeNode* right; // 右子树指针 } TreeNode, *Tree; /* 创建二叉树 */ void createTree(char* str, Tree* tree) { if (*str == '\0') { *tree = NULL; return; } if (*tree == NULL) { *tree = (Tree)malloc(sizeof(TreeNode)); } if (*str == '#') { // 空节点 *tree = NULL; } else { (*tree)->data = *str; createTree(str + 2, &((*tree)->left)); // 创建左子树 createTree(str + 4, &((*tree)->right)); // 创建右子树 } } /* 前序遍历 */ void preOrderTraversal(Tree tree) { if (tree == NULL) { return; } printf("%c", tree->data); preOrderTraversal(tree->left); preOrderTraversal(tree->right); } /* 中序遍历 */ void inOrderTraversal(Tree tree) { if (tree == NULL) { return; } inOrderTraversal(tree->left); printf("%c", tree->data); inOrderTraversal(tree->right); } /* 后序遍历 */ void postOrderTraversal(Tree tree) { if (tree == NULL) { return; } postOrderTraversal(tree->left); postOrderTraversal(tree->right); printf("%c", tree->data); } /* 销毁二叉树 */ void freeTree(Tree tree) { if (tree == NULL) { return; } freeTree(tree->left); freeTree(tree->right); free(tree); } /* 主函数 */ int main() { char str[] = "A,B,#,C,#,#,D,#,#"; Tree tree = NULL; createTree(str, &tree); // 创建二叉树 printf("中序遍历结果:"); inOrderTraversal(tree); // 中序遍历 printf("\n"); freeTree(tree); // 销毁二叉树 return 0; }找出以上程序错误并修改
以上程序仅实现了中序遍历,因此需要添加前序遍历和后序遍历函数。以下是完整的修改后的程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TreeNode {
char data; // 节点数据
struct TreeNode* left; // 左子树指针
struct TreeNode* right; // 右子树指针
} TreeNode, *Tree;
/* 创建二叉树 */
void createTree(char* str, Tree* tree) {
if (*str == '\0') {
*tree = NULL;
return;
}
if (*tree == NULL) {
*tree = (Tree)malloc(sizeof(TreeNode));
}
if (*str == '#') { // 空节点
*tree = NULL;
} else {
(*tree)->data = *str;
createTree(str + 2, &((*tree)->left)); // 创建左子树
createTree(str + 4, &((*tree)->right)); // 创建右子树
}
}
/* 前序遍历 */
void preOrderTraversal(Tree tree) {
if (tree == NULL) {
return;
}
printf("%c", tree->data);
preOrderTraversal(tree->left);
preOrderTraversal(tree->right);
}
/* 中序遍历 */
void inOrderTraversal(Tree tree) {
if (tree == NULL) {
return;
}
inOrderTraversal(tree->left);
printf("%c", tree->data);
inOrderTraversal(tree->right);
}
/* 后序遍历 */
void postOrderTraversal(Tree tree) {
if (tree == NULL) {
return;
}
postOrderTraversal(tree->left);
postOrderTraversal(tree->right);
printf("%c", tree->data);
}
/* 销毁二叉树 */
void freeTree(Tree tree) {
if (tree == NULL) {
return;
}
freeTree(tree->left);
freeTree(tree->right);
free(tree);
}
/* 主函数 */
int main() {
char str[] = "A,B,#,C,#,#,D,#,#";
Tree tree = NULL;
createTree(str, &tree); // 创建二叉树
printf("前序遍历结果:");
preOrderTraversal(tree); // 前序遍历
printf("\n");
printf("中序遍历结果:");
inOrderTraversal(tree); // 中序遍历
printf("\n");
printf("后序遍历结果:");
postOrderTraversal(tree); // 后序遍历
printf("\n");
freeTree(tree); // 销毁二叉树
return 0;
}
```
请优化一下代码:#include <stdio.h> #include <stdlio.h> #define MaxSize 100 typedef char ElemType; typedef struct node//二叉树顺序结构的类型声明 { ElemType data;//数据元素 struct node *lchild;//指向左孩子结点 struct node *rchild;//指向有孩子结点 }BTNode; void CreateBTree(BTNode *&b,char *str)//创建二叉树 { BTNode *St[MaxSize],*p; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while(ch!='\0') { switch(ch) { case'(':top++;St[top]=p;k=1;break; case')':top--;break; case',':k=2;break; default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) b=p; else { switch(k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; } } void DestoryBTree(BTNode *&b)//销毁二叉树 { if(b!=NULL) { DestoryBTree(b->lchild); DestoryBTree(b->rchild); free(b); } } BTNode *FindNode(BTNode *b,ELemType x)//查找节点 { BTNode *p; if(b==NULL) return NULL; else if(b->data==x) return b; else { p=FindNode(b->lchild,x); if(p!=NULL) return p; else return FindNode(b->lchild,x); } } BTNode *LchildNode(BTNode *p)//返回节点p的左孩子节点 { return p->lchild; } BTNode *RchildNode(BTNode *p)//返回节点p的右孩子节点 { return p->rchild; } int BTHeight(BTNode *b) { int lchildh,rchildh; if(b==NULL)return(0); else { lchildh=BTHeight(b->lchild); rchildh=BTHeight(b->rchild); return (lchildh>rchildh)?(lchildh+1):(rchildh+1); } } void DispBTree(BTNode *b)//输出二叉树 { if(b!=NULL) { printf("%c",b->data); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); DispBTree(b->lchild); if(b->rchild!=NULL)printf(","); DispBTree(b->rchild); printf("("); } } } void PreOrder(BTNode *b)//先序遍历 { if(b!=NULL) { printf("%c",b->data); PreOrder(b->lchild); PreOrder(b->rchild); } } void InOrder(BTNode *b)//中序遍历 { if(b!=NULL) { InOrder(b->lchild); printf("%c",b->data); InOrder(b->rchild); } }
优化后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node {
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
void CreateBTree(BTNode *&b, char *str) {
if (!str || !*str) {
b = NULL;
return;
}
BTNode *St[MaxSize], *p;
int top = -1, k, j = 0;
char ch = str[j];
while (ch != '\0') {
switch (ch) {
case '(':
top++;
St[top] = p;
k = 1;
break;
case ')':
top--;
break;
case ',':
k = 2;
break;
default:
p = (BTNode *)malloc(sizeof(BTNode));
p->data = ch;
p->lchild = p->rchild = NULL;
if (b == NULL) {
b = p;
} else {
switch (k) {
case 1:
St[top]->lchild = p;
break;
case 2:
St[top]->rchild = p;
break;
}
}
}
j++;
ch = str[j];
}
}
void DestroyBTree(BTNode *&b) {
if (b == NULL) {
return;
}
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
b = NULL;
}
BTNode *FindNode(BTNode *b, ElemType x) {
if (b == NULL) {
return NULL;
}
if (b->data == x) {
return b;
}
BTNode *p = FindNode(b->lchild, x);
if (p != NULL) {
return p;
}
return FindNode(b->rchild, x);
}
BTNode *LchildNode(BTNode *p) {
return p ? p->lchild : NULL;
}
BTNode *RchildNode(BTNode *p) {
return p ? p->rchild : NULL;
}
int BTHeight(BTNode *b) {
if (b == NULL) {
return 0;
}
int lchildh = BTHeight(b->lchild);
int rchildh = BTHeight(b->rchild);
return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
}
void DispBTree(BTNode *b) {
if (b == NULL) {
return;
}
printf("%c", b->data);
if (b->lchild != NULL || b->rchild != NULL) {
printf("(");
DispBTree(b->lchild);
if (b->rchild != NULL) {
printf(",");
}
DispBTree(b->rchild);
printf(")");
}
}
void PreOrder(BTNode *b) {
if (b == NULL) {
return;
}
printf("%c", b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
void InOrder(BTNode *b) {
if (b == NULL) {
return;
}
InOrder(b->lchild);
printf("%c", b->data);
InOrder(b->rchild);
}
```
主要的优化如下:
1. 增加了空指针判断,避免程序崩溃。
2. 修改了头文件的拼写错误,将 "stdio.h" 和 "stdlio.h" 改为 "stdio.h" 和 "stdlib.h"。
3. 销毁二叉树函数中加入了将指针赋值为 NULL 的语句,避免悬空指针的出现。
4. 返回节点的左孩子和右孩子节点的函数中加入了空指针判断,避免返回 NULL 指针。
5. 其他一些格式和语法上的调整和修改。
阅读全文