《剑指offer》根据先序序列与中序序列重建二叉树-Java
来源:互联网 发布:yii框架连接数据库 编辑:程序博客网 时间:2024/06/07 05:22
在刷面试算法题,见到有大神的代码灰常简洁,灰常牛B,拿过来膜拜一下
public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1); return root; } //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) { if(startPre>endPre||startIn>endIn) return null; TreeNode root=new TreeNode(pre[startPre]); for(int i=startIn;i<=endIn;i++) if(in[i]==pre[startPre]){ root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn); } return root; }}
大神把递归用得如此出神入化,我最主要记录下
root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
这两句的理解:
每一次的递归都分开左子树和右子树来生成,先来第一句
startPre+1:因为先序序列的第一个数就是根节点,所以第一次递归让先序序列的开始下标+1
startPre+i-startIn:然后看中序序列的根节点在哪个位置,那个位置就是i,把先序序列中的开始下标+i(所有左子树的个数)减去中序序列的开始下标(减去上一些根节点的左子树),就是这一段子树的尾端
startIn:因为中序序列的第一个值不是根,所以直接取该开始下标
i-1:因为i是根在中序序列的位置,所以要减去一
i-startIn+startPre+1:右子树中,因为有可能之前迭代过几次,所以i不一定对应正确的位移,所以让i-startIn得出这一个右子树中左子树的量,然后加一,因为第一个数是根嘛
endPre:直接取先序序列中的尾端,因为这个根结点右边的都是该结点右子树
i+1:中序序列中,直接+1,因为i是根节点,根节点右边开始都属于右子树
endIn:同理直接取中序序列的末尾下标
表达能力有点不足,也不知道过一段时间还能不能看懂自己写的东西哈哈~
0 0
- 《剑指offer》根据先序序列与中序序列重建二叉树-Java
- 根据先序序列和中序序列重建二叉树
- 根据先序遍历序列和中序遍历序列重建二叉树
- 剑指offer--重建二叉树[根据二叉树的先序、中序遍历结果重建二叉树]
- 根据先序序列与中序序列构建二叉树
- 根据前序和中序序列重建二叉树
- 根据前序和中序列 重建二叉树
- 根据先序和中序序列求二叉树
- 根据先序与中序遍历序列重构二叉树;
- 根据中序和先序重建二叉树+二叉树的镜像+二叉树的深度+判断后序序列+判断子树
- [LeetCode] 根据前序序列和中序序列重建二叉树
- 根据前序遍历序列和中序遍历序列重建二叉树
- 根据前序遍历序列和中序遍历序列重建二叉树
- 根据前序序列和中序序列重建二叉树
- 【剑指offer】如何通过先序遍历与中序遍历重建二叉树
- 剑指offer-重建二叉树 由前序和中序遍历序列建树
- 剑指Offer_06 根据前序遍历和中序遍历序列 重建二叉树
- 剑指:根据输入的前序和中续遍历序列重建二叉树
- spark streaming性能优化
- 归并排序
- 机器学习(六):集成算法(1)Bagging
- View的事件分发机制
- Spring Bean的生命周期
- 《剑指offer》根据先序序列与中序序列重建二叉树-Java
- Centos7 CM5和CDH5(5.9.0) 离线安装
- CM开机动画 BootanimationMikuSony
- nova组件-rescue/unrescue
- 逆波兰表达式的生成(Java版)
- Storm入门学习随记
- 工具
- 汇道科技:PHP编程语言可以应用在哪些方面?
- TreeSet去重排序(华为研发工程师编程题)