利用中序和前序遍历确定并生成一颗唯一的树
来源:互联网 发布:tf卡测试软件 编辑:程序博客网 时间:2024/06/05 20:08
前言
总所周知,一棵树是可以由其前序遍历与中序遍历或者中序遍历和前序遍历来唯一确定的。因此,我们也就可以利用这个结论,在拥有前序遍历和中序遍历的基础上建立一颗唯一的树。
基本思想
实现这个的基本思想在于找到树的根节点。
当你利用前序遍历的第一个元素,就可以找到这棵树的根节点,而在中序遍历中,根节点的左边则是表示树的左子树,而右边则是表示树的右子树。因此,我们可以利用这点,找到这棵树的左(右)子树的前序与中序的遍历的遍历序列。此时,我们能够将这新的遍历序列看做是一颗新的树,因此,可以利用相同的方法找到子树的根节点。以此类推,便可以找到这棵树的所有的根节点。当这些根节点按照找到的顺序先后连接起来(后找到的根节点自然是子树的根节点),便可以建立一个树了。
代码实现
核心代码
二叉树的数据结构
//二叉树typedef struct BinaryTree {//<---------------数据域--------------> char data; //element int index; //index of node//<---------------指针域--------------> struct BinaryTree* leftChild; //left child struct BinaryTree* rightChild; //right child}BinaryTree, *pBinaryTree;
利用前序与中序遍历建立二叉树的代码
void createBinaryTree(pBinaryTree &binaryTree, string presequeue, string insequeue) { //若二叉树不存在则退出 if (0 == presequeue.length()) { binaryTree = NULL; return; } //根节点,前序遍历的首节点则是根节点 char rootNode = presequeue[0]; //从中序遍历中找到该节点的位置 int index = insequeue.find(rootNode); //若寻找不到节点说明输入错误 if (index<0 && index>insequeue.length()) { cout << "输入错误" << endl; binaryTree = NULL; return; } //中序遍历中的根节点的左边则是左子树,右边则是右子树 //因此,可以将这个树分成两个左右孩子的中序遍历的序列 string leftChildInsequeue = insequeue.substr(0,index); //左孩子中序排序子序列 string rightChildInsequeue = insequeue.substr(index + 1);//右孩子中序排序子序列 //因此可以求出左右子序列的长度 int leftChildLength = leftChildInsequeue.length(); //左孩子的长度 int rightChildLength = rightChildInsequeue.length(); //右孩子的长度 //得知了左右子序列的长度之后,就可以建立左右子序列的前序遍历序列 string leftChildPresequeue = presequeue.substr(1, leftChildLength); //左孩子前序排序子序列 string rightChildPresequeue = presequeue.substr(leftChildLength+1); //右孩子前序排序子序列 //建立树的根节点 binaryTree = (BinaryTree *)malloc(sizeof(BinaryTree)); /*由于利用这种方式可以不断的分离出左右孩子的子序列,并且能够找到其根节点.因此,可以利用递归算法,不断的分离这棵二叉树,从而达到一个一个节点的地步由于在分离的途中,不断的寻找二叉树的根节点,因此,利用此方法既可以建立一个唯一确定的二叉树*/ if (binaryTree != NULL) { binaryTree->data = rootNode;//记录信息 createBinaryTree(binaryTree->leftChild, leftChildPresequeue, leftChildInsequeue);//创建左孩子 createBinaryTree(binaryTree->rightChild, rightChildPresequeue, rightChildInsequeue);//创建右孩子 }}
当然,若是能用迭代的算法自然要比递归的算法要好得多。不过,在这里,笔者也就只贴上了递归的算法,迭代的算法与递归的算法的思想是异曲同工的,有兴趣的读者可以去实现一下哟。
实现结果
0 0
- 利用中序和前序遍历确定并生成一颗唯一的树
- 前序遍历和中序遍历序列能确定唯一的一棵二叉树
- 根据前序遍历和中序遍历的结果确定后序遍历
- 二叉树根据前序遍历和中序遍历重构确定唯一二叉树
- 【数据结构】一颗二叉树的中序遍历和前序遍历,求后序遍历
- 只给出先序遍历和后序遍历不能唯一确定二叉树的例子
- 如何根据前序遍历序列和中序遍历序列确定二叉树
- 如何根据前序遍历序列和中序遍历序列确定二叉树
- 二叉树 二叉树带虚结点表示的先序遍历可以确定唯一一颗二叉树
- C++ 根据前序遍历序列和中序遍历序列可以构造唯一的二叉树
- [leetcode]Construct Binary Tree from Inorder and Postorder Traversal (利用中序遍历和后续遍历确定一颗二叉树)
- 由先序+后序遍历确定序列是否唯一并输出一个中序序列
- 为什么只给出前序以及后序遍历,不能生成唯一的二叉树
- 已知一颗二叉树的前序和中序序列,唯一的确定一颗二叉树
- 由树的前序遍历,中序遍历建立一颗二叉树,并以后续遍历的方式输出其元素
- 由中序序列和后序序列唯一确定一棵二叉树
- 由中序序列和后序序列唯一确定一棵二叉树
- 前序和中序确定二叉树,并以后序输出
- 关于找工作:招聘网站&市场行情&工作(iOS&Android)&简历&面试&租房
- CAS的PGTURL、PGTIOU有什么作用?
- Oracle安装的一些问题
- 人工智能最有前景的六大领域
- 【正则表达式】正则表达式处理图片地址、img标签的方法
- 利用中序和前序遍历确定并生成一颗唯一的树
- 给oracle中某个表添加一个新的字段的sql
- 用Sketch和PaintCode快速得到绘制代码
- javascript-clipboard.js教程
- Highcharts应用--动态玫瑰图
- 为什么我们喜欢用 async function
- Android ListView工作原理完全解析,带你从源码的角度彻底理解
- 【opencv】python3 将图片生成视频文件
- Android线程池