leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal
来源:互联网 发布:淘宝茶叶有多少人竞争 编辑:程序博客网 时间:2024/05/17 01:05
描述:
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.将中序遍历序列和其对应的下标存储到一个map中,方便下面的查找
2.递归选取前序序列的第一个元素作为树的根节点,然后查找根节点在前序序列中位置inorderIndex,inorderIndex-startInorder可以得到左子树的长度
3.根据左子树的长度和startPreOrder可以求出前序序列中左子树的起始位置
4.从上面可以求出左右子树的前序序列和中序序列的起始位置,递归调用建树过程即可。
PS:其实,对于这道题,有更简单的方法,可根据按前序序列元素出现的顺序依次作为树的根节点进行前序建树,这样要简单多了,根本不用分别计算前序和中序序列的左右子树的起始位置,哪天把这种方法的代码给补上。我的方法好繁呐,但是,我感觉更直接,而且,前序中序后序建树均可。
代码:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { int []ArrPreorder;int []ArrInorder; Map<Integer, Integer>mapInorder=new HashMap<Integer, Integer>();public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==0||preorder==null)return null;ArrPreorder=preorder; ArrInorder=inorder; for(int i=0;i<inorder.length;i++) mapInorder.put(inorder[i], i); int start=0, end=preorder.length-1; TreeNode root =new TreeNode(0); createTree(root,start,end,start, end); return root; }public void createTree(TreeNode root, int start1,int end1,int start2,int end2){int subStart1=start1,subStart2=start2,subEnd1=end1,subEnd2=end2;int target=ArrPreorder[start1];int indexInOrder=mapInorder.get(target);int len=indexInOrder-start2;int indexPreOrder=start1+len;if(start2<=indexInOrder-1){subStart1=start1+1;subEnd1=indexPreOrder;subEnd2=indexInOrder-1;root.left=new TreeNode(0);createTree(root.left,subStart1,start2, subStart2, subEnd2);}root.val=target;if(indexInOrder+1<=end2){subStart1=indexPreOrder+1;subStart2=indexInOrder+1;root.right=new TreeNode(0);createTree(root.right,subStart1,end1, subStart2, end2);}}}
结果:
0 0
- leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal
- Leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal
- *(leetcode) Construct Binary Tree from Preorder and Inorder Traversal (tree)
- LeetCode[Tree]: Construct Binary Tree from Preorder and Inorder Traversal
- [leetcode][tree] Construct Binary Tree from Preorder and Inorder Traversal
- Construct Binary Tree from Preorder and Inorder Traversal & Construct Binary Tree from Inorder and P
- LeetCode: Construct Binary Tree from Preorder and Inorder Traversal
- Construct Binary Tree from Preorder and Inorder Traversal
- [LeetCode]Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode Construct Binary Tree from Preorder and Inorder Traversal
- [Leetcode] Construct Binary Tree from Preorder and Inorder Traversal
- Leetcode: Construct Binary Tree from Preorder and Inorder Traversal
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode Construct Binary Tree from Preorder and Inorder Traversal
- leetcode 109: Construct Binary Tree from Preorder and Inorder Traversal
- 【leetcode】Construct Binary Tree from Preorder and Inorder Traversal
- Construct Binary Tree from Preorder and Inorder Traversal
- Construct Binary Tree from Preorder and Inorder Traversal
- 优化数据页面(6)——用宽粗的字体突出标题行
- 套接字与网络通信
- jeesite研究
- Android布局的一些实用小策略
- 数据库内核中的二分查找
- leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal
- vsftpd.conf 详解与实例配置
- 关于boost中lambda表达式的学习
- uboot的relocation原理详细分析
- 【安卓开发】最佳实践之一:安卓开发篇
- flume源码阅读之主启动类
- 欢迎使用CSDN-markdown编辑器
- Block
- ARGB32 相关操作