CreateBiTree(BiTree*bt)在后面int main里调用时,为什么传入一级指针的地址
时间: 2023-12-06 10:40:25 浏览: 73
函数 `CreateBiTree(BiTree* bt)` 接收一个指向二叉树的指针 `bt`。如果想要在函数内部修改指向二叉树的指针 `bt`,那么需要传入指向指针 `bt` 的指针,即二级指针。因此,在调用 `CreateBiTree()` 函数时,需要传入 `&bt`,即指向指针 `bt` 的地址。这样在函数内部就可以通过一级指针的地址来修改指向二叉树的指针 `bt` 的值,使其指向创建好的二叉树的根节点。
相关问题
(1)编写二叉树的基本操作函数。 ①创建一棵二叉树 CreateBiTree(BiTree *T); ②先序遍历,递归方法 re_PreOrder(BiTree * tree ) ③中序遍历,递归方法 re_MidOrder(BiTree * tree ) ④后序遍历,递归方法 re_PostOrder(BiTree * tree ) (2)调用上述函数实现下列操作。 用递归方法分别先序、中序和后序遍历二叉树; 注意 要求动态显示二叉树的建立过程。
以下是基本操作函数的代码实现:
```c++
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;
// 二叉树结构体定义
typedef struct BiTNode
{
char data; // 数据域
struct BiTNode *lchild, *rchild; // 左右子树指针
}BiTNode, *BiTree;
// 递归创建二叉树
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if (ch == '#')
T = NULL;
else
{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
// 递归先序遍历
void re_PreOrder(BiTree T)
{
if (T != NULL)
{
cout << T->data << " ";
re_PreOrder(T->lchild);
re_PreOrder(T->rchild);
}
}
// 递归中序遍历
void re_MidOrder(BiTree T)
{
if (T != NULL)
{
re_MidOrder(T->lchild);
cout << T->data << " ";
re_MidOrder(T->rchild);
}
}
// 递归后序遍历
void re_PostOrder(BiTree T)
{
if (T != NULL)
{
re_PostOrder(T->lchild);
re_PostOrder(T->rchild);
cout << T->data << " ";
}
}
// 层序遍历
void levelOrder(BiTree T)
{
queue<BiTree> q;
if (T != NULL)
{
q.push(T);
}
while (!q.empty())
{
BiTree p = q.front();
q.pop();
cout << p->data << " ";
if (p->lchild != NULL)
q.push(p->lchild);
if (p->rchild != NULL)
q.push(p->rchild);
}
}
// 主函数
int main()
{
BiTree T;
CreateBiTree(T);
cout << "先序遍历:";
re_PreOrder(T);
cout << endl;
cout << "中序遍历:";
re_MidOrder(T);
cout << endl;
cout << "后序遍历:";
re_PostOrder(T);
cout << endl;
cout << "层序遍历:";
levelOrder(T);
cout << endl;
return 0;
}
```
在这个代码中,我们定义了一个二叉树结构体,并实现了二叉树的基本操作函数:创建二叉树、递归先序遍历、递归中序遍历、递归后序遍历。我们还实现了层序遍历函数,用于比较不同遍历方法的输出结果。
在主函数中,我们首先调用 CreateBiTree 函数创建一棵二叉树,然后依次调用不同的遍历函数输出遍历结果。最后,我们再次调用层序遍历函数输出二叉树的层序遍历结果。
在输出遍历结果时,我们可以看到每个节点的访问顺序,可以根据这个顺序验证遍历方法的正确性。同时,我们在程序中使用了递归算法,在实现上更为简单,易于理解。
至于要求动态显示二叉树的建立过程,这可以通过在 CreateBiTree 函数中添加一些输出语句来实现。例如,可以在每次递归调用前输出当前节点的值,这样就可以实现动态显示建树过程了。
帮我用C语言写一个二叉树操作的程序(1)编写二叉树的基本操作函数。①创建一棵二叉树 CreateBiTree(BiTree *T); ②先序遍历,递归方法 re_PreOrder(BiTree * tree ) ③中序遍历,递归方法 re_MidOrder(BiTree * tree ) ④后序遍历,递归方法 re_PostOrder(BiTree * tree )(2)调用上述函数实现下列操作。 用递归方法分别先序、中序和后序遍历二叉树; 注意 要求动态显示二叉树的建立过程。要求各函数名称,函数形参和实参与我的要求一致,设定一个标志位,当输入那个标志时表示树初始化完成,写一个菜单可以选择先序、中序还是后序
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 树的最大节点数
typedef struct BiTreeNode {
char data; // 数据域
struct BiTreeNode *lchild, *rchild; // 左右孩子指针
} BiTreeNode, *BiTree;
int index = 0; // 全局变量,用于记录当前读入字符的下标
// 创建二叉树
void CreateBiTree(BiTree *T) {
char ch = getchar(); // 读入字符
if (ch == '#') { // 如果是 # 表示该节点为空
*T = NULL;
} else {
*T = (BiTree) malloc(sizeof(BiTreeNode)); // 为该节点分配内存
(*T)->data = ch; // 存储节点数据
CreateBiTree(&((*T)->lchild)); // 递归创建左子树
CreateBiTree(&((*T)->rchild)); // 递归创建右子树
}
}
// 先序遍历
void re_PreOrder(BiTree tree) {
if (tree) { // 如果不为空
printf("%c ", tree->data); // 输出该节点数据
re_PreOrder(tree->lchild); // 递归遍历左子树
re_PreOrder(tree->rchild); // 递归遍历右子树
}
}
// 中序遍历
void re_MidOrder(BiTree tree) {
if (tree) { // 如果不为空
re_MidOrder(tree->lchild); // 递归遍历左子树
printf("%c ", tree->data); // 输出该节点数据
re_MidOrder(tree->rchild); // 递归遍历右子树
}
}
// 后序遍历
void re_PostOrder(BiTree tree) {
if (tree) { // 如果不为空
re_PostOrder(tree->lchild); // 递归遍历左子树
re_PostOrder(tree->rchild); // 递归遍历右子树
printf("%c ", tree->data); // 输出该节点数据
}
}
// 动态显示二叉树的建立过程
void display(BiTree T, int depth) {
if (T == NULL) { // 如果节点为空
return;
}
display(T->rchild, depth + 1); // 先遍历右子树
for (int i = 0; i < depth; i++) {
printf(" "); // 每个节点之间间隔4个空格
}
printf("%c\n", T->data); // 输出该节点数据
display(T->lchild, depth + 1); // 再遍历左子树
}
int main() {
BiTree T = NULL;
printf("请输入二叉树的节点数据,以 # 表示空节点:\n");
CreateBiTree(&T);
printf("创建二叉树成功!\n");
printf("动态显示二叉树的建立过程如下:\n");
display(T, 0);
printf("请选择遍历方式:\n");
printf("1. 先序遍历\n");
printf("2. 中序遍历\n");
printf("3. 后序遍历\n");
int choice;
scanf("%d", &choice);
printf("遍历结果为:\n");
switch (choice) {
case 1:
printf("先序遍历结果为:");
re_PreOrder(T);
break;
case 2:
printf("中序遍历结果为:");
re_MidOrder(T);
break;
case 3:
printf("后序遍历结果为:");
re_PostOrder(T);
break;
default:
printf("输入有误,请重新运行程序!");
break;
}
printf("\n");
return 0;
}
```
代码实现思路:
首先定义了一个 `BiTreeNode` 结构体,表示二叉树的节点,包括数据域和左右孩子指针。
然后定义了一个 `CreateBiTree` 函数,用于创建二叉树。该函数使用递归的方式读入字符,如果读入的字符是 #,表示该节点为空;否则为该节点分配内存,存储节点数据,并递归创建左右子树。
接着定义了三个遍历函数:`re_PreOrder`、`re_MidOrder` 和 `re_PostOrder`,分别表示先序遍历、中序遍历和后序遍历。这三个函数都是递归实现的,具体实现方法可以参考代码中的注释。
最后在 `main` 函数中,先调用 `CreateBiTree` 函数创建二叉树,并通过 `display` 函数动态显示二叉树的建立过程。然后根据用户选择的遍历方式,调用相应的遍历函数输出遍历结果。
阅读全文