相关链接:

链表总结----链表面试题合集

二叉树----二叉树面试题合集

1、二叉树定义

typedef struct BTreeNodeElement_t_ {void *data;
} BTreeNodeElement_t;typedef struct BTreeNode_t_ {BTreeNodeElement_t     *m_pElemt;struct BTreeNode_t_    *m_pLeft;struct BTreeNode_t_    *m_pRight;
} BTreeNode_t;

二、依据前序遍历序列和中序遍历序列重建二叉树

算法说明:

由中序遍历序列可知,第一个节点是根节点,

由前序遍历序列可知,第一个节点是根节点的左子树节点,并且前序遍历中,根节点左边是左子树,右边是右子树,因此通过中序遍历的根节点能够确定的是:

根节点在前序遍历中的位置(通过遍历前序遍历序列,比較每个节点与中序遍历中的第一个节点即根节点可知);

左子树的节点数,由于一旦找到前序遍历中根节点的位置,就找到左右子树的分界点,也就是说,前序遍历中根节点左边的都是左子树节点,能够通过遍历知道左子树的节点数;

相同,右子树的节点数也能够确定。

通过以上确定的信息,能够划分出前序遍历中的左右子树节点数,根节点位置;因此,以下就是进行求根节点左节点和右节点,而依据上述划分,能够知道左子树前序和中序序列起始位置以及长度、右子树前序和中序序列起始位置以及长度,这样能够递归依照上述方式相同获得左右子树的根节点。

通过递归能够求得整个树的结构。

BTreeNode_t  * RebuildBTree( const BTreeNodeElement_t *pPreorder,  const BTreeNodeElement_t *pInorder, const int nodesTotal, int(*compare)(const BTreeNodeElement_t*, const BTreeNodeElement_t *)){if( pPreoder == NULL || pInorder == NULL || nodesTotal <= 0 || compare == NULL)return NULL;BTreeNodeElement_t *pRootData = &pInorder[0];  //找到当前树的根节点BTreeNode_t *pRoot= new  BTreeNode_t;pRoot->m_pElemt = pRootData;int rootIndex = -1;for( int i = 0; i < nodesTotal; ++i){if( compare( pRootData, &pPreorder[i]) == 0){rootIndex = i;brea;}}if( rootIndex == -1 )return NULL;//依据查找到根节点得到的信息,左子树长度,右子树长度等int leftNodesTotal = rootIndex;BTreeNodeElement_t *pLeftPreorder = pPreorder + 1;BTreeNodeElement_t *pLeftInorder = pInorder;pRoot->m_pLeft = RebuildBTree( pLeftPreorder, pInorder, leftNodesTotal, compare);//右子树信息int rightNodesTotal = nodesTotal - leftNodesTotal - 1;//减去右子树节点数和一个根节点BTreeNodeElement_t *pRightPreOrder = pPreorder + leftNodesTotal + 1;BTreeNodeElement_t *pRightInorder = pInorder + leftNodesTotal + 1;pRoot->m_pRight = RebuildBTree( pRightPreOrder, pRightInorder, rightNodesTotal, compare);return pRoot;
}

转载于:https://www.cnblogs.com/bhlsheji/p/4303060.html

二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式相关推荐

  1. 根据二叉树的前序遍历和中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  2. 二叉树的创建、前序遍历、中序遍历、后序遍历

    二叉树的创建.前序遍历.中序遍历.后序遍历 // BTree.cpp : Defines the entry point for the console application. /*  作者:成晓旭 ...

  3. 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列

    题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历: ...

  4. 二叉树、前序遍历、中序遍历、后序遍历

    一.树 在谈二叉树前先谈下树和图的概念 树:不包含回路的连通无向图(树是一种简单的非线性结构) 树有着不包含回路这个特点,所以树就被赋予了很多特性 1.一棵树中任意两个结点有且仅有唯一的一条路径连通 ...

  5. 通过前序遍历和中序遍历构建二叉树 python实现

    前言 通过前序遍历和中序遍历构建二叉树的原理,主要是找前序遍历根节点在中序遍历中的位置,然后将二叉树而成左子树和右子树,然后依次进行这样的操作,思路还是比较简单的 代码 class Node:def ...

  6. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  7. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)

    经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...

  8. 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

    二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或 ...

  9. Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)

    文章目录 前序.中序.后序的含义 实例 Code (递归) 前序遍历 中序遍历 后序遍历 测试 Code (非递归) 前序.中序.后序的含义 前序遍历: 先输出父节点,再遍历左子树,最后遍历右子树 中 ...

  10. 根据二叉树前序遍历和中序遍历重建二叉树

    剑指 Offer 07. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3, ...

最新文章

  1. Netty专题-(2)NIO三大核心
  2. c# export server 调用sql_[转]使用C#调用cmd来执行sql脚本
  3. 4行代码AC——L1-038 新世界 (5分)
  4. 面试39 MySQL读写分离
  5. 如何基于TensorFlow使用LSTM和CNN实现时序分类任务
  6. java 类型 转换 valueOf和parse...
  7. 凑数算法 java_[蓝桥杯][2017年第八届真题]包子凑数 (Java代码)
  8. vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。...
  9. hdu 1207汉诺塔II 递推
  10. ES6学习笔记六(新增数据结构)
  11. 软件测试面试常用Linux命令总结
  12. java图书馆抢座系统_JSP+SSM+Mysql实现的图书馆预约占座管理系统
  13. rss对称网卡linux,dpdk-18.11网卡多队列RSS设置
  14. 微信小程序开发--习题
  15. insist fortress g55 机械键盘得救了
  16. 一个程序员自媒体人的2017年终总结
  17. 【洛谷P4315】月下毛景树 树链剖分03
  18. 短信验证码和语音验证码
  19. QIIME2-傻瓜式安装
  20. 什么是TLB ?(转载)

热门文章

  1. 大厂php怎么做前端,大厂前端经典面试问题精选(附答案)
  2. 机器学习知识点(二十一)特征选择之岭回归和LASSO
  3. printf 指针地址_c语言入门 第十四章指针
  4. MyBatis简介——半自动的持久化层框架(SQL映射框架)|| 支持定制化sql
  5. SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法
  6. Chrome 浏览器降级后浏览网站不保留用户数据问题原因及解决方法
  7. Python 自动化-pywinauto遍历展示程序的所有菜单项,菜单栏menu_select()操作方法的使用
  8. Python 爬虫进阶篇-利用beautifulsoup库爬取网页文章内容实战演示
  9. 正则验证车牌号码,包括新能源车牌
  10. CTFshow 反序列化 web255