重建二叉树
来源:互联网 发布:淘宝网智能手机 编辑:程序博客网 时间:2024/06/18 09:25
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思想:前序遍历的第一个节点肯定是根节点。然后根据值比较,遍历中序遍历序列,把根节点值的左边划分为左子树,右边划分为右子树。然后递归实现。
/** * 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() == 0 && pre.size() != in.size()) return NULL;<span style="white-space:pre"></span>//两个序列不能为空,且必须相等 struct TreeNode* root =new TreeNode(pre[0]); root->val = pre[0]; vector<int> left_pre,left_in; vector<int> right_pre,right_in; size_t i;<span style="white-space:pre"></span>//vector的下标用的是size_t类型,就是无符号整数类型 for(i=0;i<in.size()&&in[i]!=pre[0];i++) { left_in.push_back(in[i]);<span style="white-space:pre"></span>//划分左子树的中序遍历序列 left_pre.push_back(pre[i+1]);<span style="white-space:pre"></span>//划分左子树的前序遍历序列,它的下标是从1开始 } i += 1;<span style="white-space:pre"></span>//i此时的指向根节点值的下标,所以要加1越过根节点
for(i;i<in.size();i++) { right_in.push_back(in[i]);<span style="white-space:pre"></span>//同上 right_pre.push_back(pre[i]);<span style="white-space:pre"></span>//右子树部分因为已经越过根节点,所以下标已经同步 } if(left_pre.size() != 0) root->left = this->reConstructBinaryTree(left_pre,left_in); if(right_pre.size() != 0) root->right = this->reConstructBinaryTree(right_pre,right_in); return root; }};添加笔记
0 0
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 记录Android-Studio遇到的各种坑
- OPENSTACK 虚拟机镜像制作指南 示例:Ubuntu 镜像
- cf#341-C. Wet Shark and Flowers-数学-概率计算
- 自定义View笔记一
- [android]_[Async异步任务使用]
- 重建二叉树
- iOS UIProgressView控件用法
- iOS开发篇——UITextField
- 哈希表字符串匹配
- UISlider用法总结
- Codeforces 621A Wet Shark and Odd and Even
- 刚试了一下,浏览器里可以玩 Windows 95
- 重设(Resize)Bitmap大小以及获取到圆形头像(Rounded Avatar)的方法
- A*启发式搜索算法详解 人工智能