重建二叉树
来源:互联网 发布:matlab最优算法 编辑:程序博客网 时间:2024/06/06 20:52
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:前序遍历序列的第一个元素是根结点,那么在中序遍历序列中找到该节点,该节点前的序列为左子树,节点后的序列为右子树。例如上面的例子,从前序遍历序列知道1时根结点,在中序遍历序列中找到1,1前面的4 7 2为左子树的中序遍历序列,1后面的5 3 8 6为右子树的中序遍历序列。左子树有3个元素,右子树有4个元素。然后看前序遍历序列,1后面的3个元素2 4 7为左子树的前序遍历序列,接下来的4个元素3 5 6 8为右子树的前序遍历序列。所以这道题可以用递归实现:
1、在前序遍历中找到根结点;
2、找到左子树的前序遍历序列和中序遍历序列,以及右子树的前序遍历序列和中序遍历序列;
3、重建左子树和右子树。
代码如下:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) {if (!pre.size() || !in.size()) return NULL;if (pre.size() != in.size()) return NULL;TreeNode* root = new TreeNode(pre[0]);int i;for (i = 0; i < in.size(); i++)if (in[i] == pre[0]) break;vector<int> preLeft, preRight, inLeft, inRight;for (int j = 1; j <= i; j++)preLeft.push_back(pre[j]);for (int j = i + 1; j < pre.size(); j++)preRight.push_back(pre[j]);for (int j = 0; j < i; j++)inLeft.push_back(in[j]);for (int j = i + 1; j < in.size(); j++)inRight.push_back(in[j]);root->left = reConstructBinaryTree(preLeft, inLeft);root->right = reConstructBinaryTree(preRight, inRight); return root;}};
0 0
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- namp 检查mysql状态 然后启动
- Maven Eclipse Run as 命令
- linux设备驱动模型之 device(设备)原理与实例分析
- 自行编写的Makefile文件的结构
- XML 常用操作
- 重建二叉树
- gdb使用方法总结
- Linux Tomcat报错: java.lang.IllegalStateException: Cannot run without an instance id.
- muduo网络库学习笔记(8):高效日志类的封装
- Java使用mysql-jdbc连接MySQL出现的错误
- 解决导入的Android项目中出现的The project was not built since和 Unable to resolve target 'android-19'错误
- mongodb
- TOJ 1859.Goldbach's Conjecture
- 死锁