关于二叉树的创建函数(Create_tree):
就笔者自己而言,初学者最难理解的部分是创建函数(Create_tree),使用了c语言没有的“引用”操作(通过‘&’来实现),函数代码见下:
void Create_tree(Node*& r)
{
char h; // 用于存储输入的字符数据
cin >> h; // 从输入流中读取字符
if (h == '.') r = NULL; // 如果输入是'.',表示空节点
else {
if (!(r = (Node*)malloc(sizeof(Node))))
{
exit(-1); // 分配内存给节点
}
r->data = h; // 将输入的字符存储到节点中
Create_tree(r->lc); // 递归创建左子树
Create_tree(r->rc); // 递归创建右子树
}
}
下面附上gpt写的解释:
/*关于create_tree函数参数中'&'的说明:
在这个函数参数中,&符号表示传递的是指向指针的引用。
通过使用引用,我们可以直接修改传递的指针的值,而不是传递指针的副本。
这样可以确保在函数内部对指针的修改对调用者也是可见的,
而不需要返回修改后的指针。
*/
遍历操作主要通过递归实现,以先序遍历为例:
void pre_order(Node* r)
{
if (r == NULL) return; // 如果节点为空,直接返回
cout << r->data << " "; // 输出节点数据
pre_order(r->lc); // 递归遍历左子树
pre_order(r->rc); // 递归遍历右子树
}
完整代码如下:
/*运行示例如下:
AD..CD..E..
A D C D E //先序
D A D C E //中序
D D E C A //后序
*/
// 包含必要的输入/输出和内存分配的头文件
#include<iostream>
#include<stdlib.h>
using namespace std;
// 定义一个具有字符数据和左/右子节点指针的结构Node
typedef struct node Node;
struct node {
char data; // 存储节点的数据
Node* lc, * rc; // 左子节点和右子节点指针
};
/*关于create_tree函数参数中'&'的说明:
在这个函数参数中,&符号表示传递的是指向指针的引用。
通过使用引用,我们可以直接修改传递的指针的值,而不是传递指针的副本。
这样可以确保在函数内部对指针的修改对调用者也是可见的,
而不需要返回修改后的指针。
*/
void Create_tree(Node*& r)
{
char h; // 用于存储输入的字符数据
cin >> h; // 从输入流中读取字符
if (h == '.') r = NULL; // 如果输入是'.',表示空节点
else {
if (!(r = (Node*)malloc(sizeof(Node))))
{
exit(-1); // 分配内存给节点
}
r->data = h; // 将输入的字符存储到节点中
Create_tree(r->lc); // 递归创建左子树
Create_tree(r->rc); // 递归创建右子树
}
}
void pre_order(Node* r)
{
if (r == NULL) return; // 如果节点为空,直接返回
cout << r->data << " "; // 输出节点数据
pre_order(r->lc); // 递归遍历左子树
pre_order(r->rc); // 递归遍历右子树
}
void in_order(Node* root)//中序
{
if (root == NULL) return; // 如果节点为空,直接返回
in_order(root->lc); // 递归遍历左子树
cout << root->data << " "; // 输出节点数据
in_order(root->rc); // 递归遍历右子树
}
void post_order(Node* r)
{
if (r == NULL) return; // 如果节点为空,直接返回
post_order(r->lc); // 递归遍历左子树
post_order(r->rc); // 递归遍历右子树
cout << r->data << " "; // 输出节点数据
}
int main()
{
Node* R;
Create_tree(R); // 创建二叉树
pre_order(R); // 先序遍历
cout << "//先序pengzhiyuan" << "\n";
in_order(R); // 中序遍历
cout << "//中序huangjiale" << "\n";
post_order(R); // 后序遍历
cout << "//后序lichenxi";
}
//sheyouhuangjialezhunbeidecaidan,lichenxiyeyao
可实现如下运行结果:
~ღ ʕ̡̢̡•̫͡•ʔ̢̡̢ ღ~
~希望对你有帮助~