重建二叉树——递归
来源:互联网 发布:windows 10 ie修复 编辑:程序博客网 时间:2024/06/06 14:07
此题加深了我对递归的应用和理解,值得一记
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路
在前序序列中,第一个一定是根节点;
然后在中序序列中找到前序序列中的第一个数,这个数的序号记为k,k左边的序列则是该根节点的左子树的中序序列,k右边则是右子树的中序序列;
在前序序列中,序号1~k的序列则是该根节点左子树的前序序列,k之后的序列则是右子树的前序序列;
采用递归则可以重建该二叉树。
注意:当前序序列和中序序列长度为0时,tree = null;
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode tree; if(pre.length == 0){ tree = null; }else{ tree = new TreeNode(pre[0]); int k = 0; for(int i = 0; i < in.length; i++){ if(in[i] == tree.val){ k = i; } } int[] preLeft = new int[k]; int[] preRight = new int[pre.length - (k + 1)]; int[] inLeft = new int[k]; int[] inRight = new int[pre.length - (k + 1)]; int count = 0; for(int i = 1; i <= k; i++){ preLeft[count] = pre[i]; count++; } count = 0; for(int i = k + 1; i < pre.length; i++){ preRight[count] = pre[i]; count++; } count = 0; for(int i = 0; i < k; i++){ inLeft[count] = in[i]; count++; } count = 0; for(int i = k + 1; i < in.length; i++){ inRight[count] = in[i]; count++; } tree.left = reConstructBinaryTree(preLeft, inLeft); tree.right = reConstructBinaryTree(preRight, inRight); } return tree; }}
0 0
- 重建二叉树——递归
- 重建二叉树:递归
- 二叉树——重建二叉树
- 二叉树的重建(递归实现)
- 重建二叉树(C++递归实现)
- 何时使用递归解决问题?-重建二叉树
- 递归重建二叉树的思路
- 树——重建二叉树
- 剑指offer——重建二叉树
- 《剑指offer》——重建二叉树
- 剑指Offer——重建二叉树
- 剑指offer——重建二叉树
- 重建二叉树——剑指offer
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- JDBC程序2:增插入、改、删
- leetcode_Longest Substring Without Repeating Characters
- HashMap实现原理分析
- hdu5919 Sequence II(主席树求区间数种数和k大查找)
- Kinect for Windows V2 SDK+ VS2010 环境搭建
- 重建二叉树——递归
- 泛型类中类型参数不能做数组的讨论
- Retrofit
- HDU_2141_Can you find it?
- Mesos源码分析
- Java面试-Spring IOC(控制反转)和DI(依赖注入)
- Struts2中的ModelDriven机制及其运用
- 电子市场项目总结(四)
- BZOJ 3611 [Heoi2014]大工程 虚树