BTNode *CreateTree(char strs[]) { int i=0,tag=0; BTNode *root=NULL,*node=NULL; BTNode *nodes[MaxSize]; //! ! ! int top=-1; char ch=strs[i]; while(ch!='\0') { switch(ch) { case '(':tag=1;nodes[++top]=node;break; case ')':top--;break; case ',':tag=2;break; default: node=(BTNode *)malloc(sizeof(BTNode)); node->left=node->right=NULL; node->data=ch; if(!root) { root=node; } else { switch(tag) { case 1:nodes[top]->left=node;break; case 2:nodes[top]->right=node;break; } } } ch=strs[++i]; } return root; }
时间: 2024-02-14 15:35:35 浏览: 117
这段代码是一个函数,函数名为 CreateTree,接受一个参数:一个字符数组 strs,表示按照特定格式表示的二叉树的结点数据。它的作用是根据字符串创建一棵二叉树,并返回根结点的指针。
具体实现是:首先定义一个指向根结点的指针 root 和一个指向当前结点的指针 node,以及一个指向节点数组的指针 nodes,和一个用于记录节点数组中最后一个元素下标的变量 top。然后遍历字符串中的每个字符,根据字符的不同进行不同的操作。如果是左括号 '(',则将当前节点存入节点数组中;如果是右括号 ')',则将节点数组的下标 top 减1,表示当前节点已经处理完毕;如果是逗号 ',',则将 tag 设置为 2,表示下一个节点是当前节点的右子节点;如果是其他字符,则表示当前节点的数据,根据 tag 的值决定将其作为左子节点还是右子节点,并更新节点数组和 top 的值。
最后返回根结点的指针。
相关问题
解析以下代码:void levelorder(BTNode *b) { int head=1,rear=1; BTNode *p,*que[MaxSize]; que[0]=0; que[++rear]=b; while(head!=rear) { p=que[++head]; printf("%c",p->data); if(p->lchild!=NULL) que[++rear]=p->lchild; if(p->rchild!=NULL) que[++rear]=p->rchild; }
这段代码实现了二叉树的层次遍历,其具体解析如下:
1. 定义了一个头指针 head 和一个尾指针 rear,一开始它们都指向队列头部。
2. 定义一个指向 BTNode 结构体的指针 p,以及一个指向 BTNode 结构体的指针数组 que,数组最大长度为 MaxSize。
3. 由于队列的特点是先进先出,因此需要在队列头部加入一个空指针,以便在后面的遍历过程中确定一层已经结束。
4. 将根节点 b 加入队列尾部,rear 指针加一。
5. 进入 while 循环,当队列头部指针 head 不等于队列尾部指针 rear 时,说明队列还有元素未被遍历。
6. 将队列头部指针 head 指向的元素赋值给指针 p,并打印出节点数据 p->data。
7. 如果当前节点 p 的左子节点不为空,则将其加入队列尾部,rear 指针加一。
8. 如果当前节点 p 的右子节点不为空,则将其加入队列尾部,rear 指针加一。
9. 重复步骤 5-8,直到队列为空。
总的来说,这段代码实现了二叉树的层次遍历,通过队列来实现遍历过程。
请优化一下代码:#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. 其他一些格式和语法上的调整和修改。
阅读全文