本篇将会介绍二叉树的创建,重点学习#号法创建树
的方法。
文章目录
- 1. 根据遍历结果创建二叉树(只需记住结论即可)
- 1.1 首先有一个问题,根据中序遍历的结果能确定一棵树吗?
- 1.2 那如何才能确定一棵树?(带中序的可以确定一个树)
- 1.3 举例
- 2. #号法创建树(重点)
- 2.1 什么是#号法创建树?
- 2.2 #号法创建树的代码实现
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##对应字符得到一个二叉树输出
- 二叉树的创建