二叉树: 构造 & 三种遍历(C++)

关于二叉树的创建函数(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

可实现如下运行结果

                                                                     ~ღ ʕ̡̢̡•̫͡•ʔ̢̡̢ ღ~

                                                                ~希望对你有帮助~

  • 39
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值