剑指offer——重建二叉树
2015-08-05 14:36
429 查看
欢迎转载,请附出处:
/article/1760890.html
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
代码如下:
/article/1760890.html
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
代码如下:
class TreeNode{ int val; TreeNode left; TreeNode right; public TreeNode(int val){ this.val = val; } } public class ReconstructTree { public static TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre==null||in==null){ return null; } TreeNode tree = reConstructCore(pre,in,0,pre.length-1,0,in.length-1); return tree; } /** *核心算法,preStart和preEnd是起始下标和结束下标 **/ public static TreeNode reConstructCore(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){ TreeNode tree = new TreeNode(pre[preStart]); tree.left = null; tree.right= null; if(preStart==preEnd&&inStart==inEnd){ return tree; } //记录中序遍历中等于前序遍历的第一位的下标 int inCenter = 0; for(inCenter = inStart;inCenter<inEnd;inCenter++){ if(in[inCenter]==pre[preStart]){ break; }else if (inCenter==inEnd) { System.err.println("输入有误,请检查输入!"); } } //左子树的长度 int leftTreeLength = inCenter-inStart; //右子数的长度 int rightTreeLength = inEnd-inCenter; if(leftTreeLength>0){ //递归左子树直到左子树的末端 tree.left = reConstructCore(pre,in,preStart+1,preStart+leftTreeLength,inStart,inCenter-1); } if(rightTreeLength>0){ //递归右子数直到右子数的末端 tree.right = reConstructCore(pre,in,preStart+leftTreeLength+1,preEnd,inCenter+1,inEnd); } return tree; } /** * 后序遍历 * @param node */ public static void traverseBinTreeRDL(TreeNode node){ if (node==null) { return; } if (node.left!=null) { traverseBinTreeRDL(node.left); } if(node.right!=null){ traverseBinTreeRDL(node.right); } System.out.println(node.val); } public static void main(String[] args){ //测试代码 int pre[] = {1,2,4,7,3,5,6,8}; int in[] = {4,7,2,1,5,3,8,6}; TreeNode tree = reConstructBinaryTree(pre, in); traverseBinTreeRDL(tree); } }
相关文章推荐
- Angularjs书写规范
- 视差滚动---parallax.js
- sql,javascript,php中字符串与变量的连接符
- jquery ajax
- jquery ajax
- underscore.js 一个强大的js函数库
- HTML——JAVASCRIPT——关灯效果
- manifest.xml属性笔记
- hibernate☞FetchType关联关系的加载策略
- 左右对齐,form-inline样式的使用
- JavaScript定义对象的2代码种风格和对象属性有两种寻址方式
- javascript 中Array.prototype.sort 函数的用法
- javascript中 Array.prototype.slice的用法.
- fedora22在virtualBox中共享目录不能用的解决办法
- JS将阿拉伯数字转为钱
- Sass 用法指南
- 技术那么多,你想看看JSON Schema的测试吗?
- JavaScript定义数组的三种方式(new Array(),new Array('x','y'),['x','y'])
- CSS的盒子模型与布局
- 网页 布局响应式设计