C++数据结构X篇_18_二叉树的创建(根据遍历结果创建二叉树;#号法创建树)

本篇将会介绍二叉树的创建,重点学习#号法创建树的方法。

1. 根据遍历结果创建二叉树(只需记住结论即可)

1.1 首先有一个问题,根据中序遍历的结果能确定一棵树吗?

举例:中序遍历结果为:“12345”,这个“12345”能确定一棵树吗?

请思考,会有多少种形状,树的形状能唯一确定吗?
在这里插入图片描述
从上面的结果可以看出,根据某一个遍历结果显然是无法确定树的形状的,这是因为你无法确认是左子树还是右子树。

1.2 那如何才能确定一棵树?(带中序的可以确定一个树)

结论:

  • 通过中序遍历和先序遍历可以确定一个树
  • 通过中序遍历和后续遍历可以确定一个树
  • 通过先序遍历和后序遍历确定不了一个树

1.3 举例

假设有两组结果:
先序遍历结果:A D E B C F
中序遍历结果:D E A C F B
根据先序遍历结果知道二叉树的根节点为A,从中序遍历结果知道二叉树的左子树为:DE,右子树为:CFB
结合分析先序和中序遍历结果,得到如下二叉树:
在这里插入图片描述

2. #号法创建树(重点)

2.1 什么是#号法创建树?

创建树,让树的每一个节点都变成度数为 2的树

先序遍历结果:124###3## (#代表null即空)
在这里插入图片描述

2.2 #号法创建树的代码实现

#include <iostream>
using namespace std;


//定义二叉树节点
class binarynode
{
public:
	char ch;			 //节点数据域
	binarynode* lchild;  //左孩子
	binarynode* rchild;  //右孩子
};

void recursion(binarynode* root)
{
	if (root == nullptr)
	{
		return;
	}
	cout << root->ch;
	recursion(root->lchild);
	recursion(root->rchild);
}

//创建树
binarynode* createBinaryTree()
{
	//清空输入缓存区
	fflush(stdin);

	//等待输入
	char ch;
	scanf("%c", &ch);

	binarynode* node;
	binarynode* lchild;  //左孩子
	binarynode* rchild;  //右孩子

	if (ch == '#')
	{
		node = nullptr;
	}
	else
	{
		lchild = createBinaryTree();
		rchild = createBinaryTree();	

		node = new binarynode;
		node->ch = ch;
		node->lchild = lchild;
		node->rchild = rchild;
	}

	return node;
}

int main()
{
	//创建树
	binarynode* root=createBinaryTree();
	//打印树
	recursion(root);
	system("pause");
	return 0;
}

运行结果:分别输入124###3##对应字符得到一个二叉树输出

  1. 二叉树的创建
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值