Bitree CreateBItree( char *h , Bitree G ) { if( !G ) { G = (Bitree)malloc(sizeof(struct BiTnode)); strcpy(G->data,h); G->lchild = G->rchild = NULL; } else if( strcmp( h , G->data ) > 0 ) G->rchild = CreateBItree( h , G->rchild ); else if( strcmp( h , G->data ) < 0) G->lchild = CreateBItree( h , G->lchild ); return G; }分析这段代码
时间: 2024-04-26 21:24:13 浏览: 74
这是一个递归函数,用于创建一个二叉树。具体流程如下:
1. 判断当前二叉树 G 是否为空,如果为空,新建一个二叉树节点,并将节点数据设置为单词表中的第一个单词 h,同时将左右子树指针设置为 NULL。
2. 如果当前二叉树节点的数据小于 h(即当前节点的单词在单词表中排在 h 的前面),递归调用该函数,将 h 插入当前节点的左子树。
3. 如果当前二叉树节点的数据大于 h(即当前节点的单词在单词表中排在 h 的后面),递归调用该函数,将 h 插入当前节点的右子树。
4. 最后返回该二叉树节点。
该函数主要利用二叉树的性质,根据单词在单词表中的大小关系,递归地将单词插入到对应的位置上,最终构建出一棵二叉树。
相关问题
#include<stdio.h> #include<stdlib.h> define char TElemType typedef struct BiTNode{ TElemType data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree *T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } void printTree(TreeNode* root) { if (root == NULL) { printf("# "); return; } printf("%c ", root->val); printTree(root->left); printTree(root->right); } int main() { BiTree T = NULL; printf("请输入先序遍历序列:\n"); CreateBiTree(&T); return 0; }这个C语言代码怎么改
这段代码存在一些问题:
1. `define char TElemType` 应该改为 `typedef char TElemType`,使得`TElemType` 成为一个类型别名,代表了二叉树节点的数据类型。
2. 函数 `printTree(TreeNode* root)` 没有声明,应该修改为 `void printTree(BiTree root)`。
修改后的代码如下:
```
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType; // 定义二叉树节点的数据类型
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree *T) {
char ch;
scanf("%c", &ch);
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void printTree(BiTree root) {
if (root == NULL) {
printf("# ");
return;
}
printf("%c ", root->data);
printTree(root->lchild);
printTree(root->rchild);
}
int main() {
BiTree T = NULL;
printf("请输入先序遍历序列:\n");
CreateBiTree(&T);
printTree(T);
return 0;
}
```
这样就可以正确地根据输入的先序遍历序列建立一棵以二叉链表表示的二叉树,并输出这棵树的先序遍历序列了。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef char ElemType; typedef struct BitNode { ElemType data[10]; struct BitNode *lchild, *rchild; } BitNode, *BiTree; void CreateBiTree(BiTree *t) { char ch[10]; scanf("%s", ch); if(ch[0] == '#') { *t = NULL; } else { *t = (BitNode*) malloc(sizeof(BitNode)); strcpy((*t)->data, ch); CreateBiTree(&((*t)->lchild)); CreateBiTree(&((*t)->rchild)); } } void InOrderTraverse(BiTree t) { if(t) { char* op = t->data; if(!isdigit(op[0])) printf("("); InOrderTraverse(t->lchild); printf("%s", t->data); InOrderTraverse(t->rchild); if(!isdigit(op[0])) printf(")"); } } int main() { BiTree tree = NULL; char ch[10]; while(scanf("%s", ch) != EOF) { tree = (BitNode*) malloc(sizeof(BitNode)); strcpy(tree->data, ch); CreateBiTree(&(tree->lchild)); CreateBiTree(&(tree->rchild)); InOrderTraverse(tree); printf("\n"); free(tree); } return 0; }
这段代码是一个简单的二叉树表达式输出程序,它可以将输入的一系列表达式以中序遍历的方式输出。程序首先定义了一个二叉树节点结构体 BitNode 和一个二叉树类型别名 BiTree。程序中使用了递归方式创建二叉树,并实现了一个中序遍历函数 InOrderTraverse,通过中序遍历的方式输出表达式。在遍历过程中,如果当前节点是操作符,则输出左括号,递归输出左右子树,输出当前节点的值,最后输出右括号;如果当前节点是数字,则直接输出数字。主函数中,程序通过循环读入表达式,创建二叉树并输出表达式,最后释放内存。
阅读全文