[LeetCode]105 根据先序遍历和中序遍历构建二叉树
2016-02-29 14:32
525 查看
Construct Binary Tree from Preorder and Inorder Traversal(根据先序遍历和中序遍历构建二叉树)
【难度:Medium】Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
给定一棵二叉树的先序遍历和中序遍历结果,重构该二叉树。
假定二叉树中无重复值出现。
解题思路
根据题意,我们先来看一棵二叉树的先序遍历和中序遍历的结果:先序遍历:1,2,4,6,7,5,3,8,9
中序遍历:6,4,7,2,5,1,8,3,9
与LeetCode 106题类似,
由先序遍历的定义,我们知道第一个值必定是二叉树的根节点root。由而中序遍历的定义,我们又可以发现根节点是左右子树的分界点。结合两者和在106题的基础上,对106的代码稍作修改,由先序遍历来确定每一个根节点,然后在中序遍历中找到该节点的下标i,那么[start, i-1]就是该i节点的左子树,[i+1, end]就是该i节点的右子树,直到叶子节点的出现。
c++代码如下:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if (preorder.empty()) return NULL; int root_index = 0; return createBST(preorder,inorder,root_index,preorder.size()-1,root_index); } TreeNode* createBST(vector<int>& preorder, vector<int>& inorder, int start, int end, int& index) { int v = preorder[index]; int i = start; for (i; i <= end; i++) if (v == inorder[i]) break; TreeNode* root = new TreeNode(v); if (i-1 >= start) root->left = createBST(preorder,inorder,start,i-1,++index); if (end >= i+1) root->right = createBST(preorder,inorder,i+1,end,++index); return root; } };
相关文章推荐
- Yii2权威指南中文版及众包翻译平台
- 【学习笔记】移动Web手册(PPK力作)
- C# 进程(应用程序)间通信
- mssql拿webshell的方法
- C# 构建XML(简单示例)
- 我的微信学习开发-----借鉴李忠益老师
- CentOS 6.5搭建 LNMP 生产环境
- 冒泡、选择和快速排序算法的C++实现
- EventBus的初级使用技巧
- 【数据结构】包含min函数的栈
- UIKit框架(10)自定义modal过渡效果
- 开发者最常用的8款Sublime text 3插件
- 对AFNetworking的简单封装
- linux centos6.5 php5.6 安装PHPUnit 5.2.9
- ES6 Promise对象
- 机器学习实战5--Logistic回归
- 《2015互联网安全年报》,移动端成重灾区,黑灰产日益成熟
- 安装git之后,桌面图片全部变成蓝色问号的标志,解决方案..
- Struts2学习(一) 基础环境搭建与创建HelloWorld程序
- SlidingMenu菜单栏的使用