剑指offer--(4) 重建二叉树
2017-09-16 12:56
344 查看
剑指offer–(4) 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路描述:
1. 前序遍历的第一个节点为根节点,故1为根节点;
2. 根据中序遍历,可得{4,7,2}为节点1的左子树的中序遍历,{5,3,8,6}节点1的右子树的中序遍历;
3. 再根据前序遍历,得到{2,4,7}为节点1的左子树的前序遍历,{3,5,8,6}为节点1右子树的中序遍历;
4. 分别对左子树和右子树重复步骤1,2,3
5. 即可得到二叉树为
1
/ \
2 3
/ / \
4 5 6
\ /
7 8
Java 实现过程为:
package com; class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class 重建二叉树 { public static void main(String[] args) { // TODO Auto-generated method stub int[] pre={1,2,4,7,3,5,6,8}; int[] in={4,7,2,1,5,3,8,6}; TreeNode treeNode= reConstructBinaryTree(pre,in); //System.out.println(treeNode); //打印中序遍历 System.out.print("中序-->"); printIn(treeNode); System.out.println(); System.out.print("前序-->"); printPre(treeNode); System.out.println(); System.out.print("后序-->"); printBack(treeNode); } //打印中序遍历 private static void printIn(TreeNode treeNode) { // TODO Auto-generated method stub if(treeNode.left!=null) printIn(treeNode.left); System.out.print(treeNode.val+" "); if(treeNode.right!=null) printIn(treeNode.right); } //打印前序遍历 private static void printPre(TreeNode treeNode) { // TODO Auto-generated method stub System.out.print(treeNode.val+" "); if(treeNode.left!=null) printPre(treeNode.left); if(treeNode.right!=null) printPre(treeNode.right); } //打印后序遍历 private static void printBack(TreeNode treeNode) { // TODO Auto-generated method stub if(treeNode.left!=null) printBack(treeNode.left); if(treeNode.right!=null) printBack(treeNode.right); System.out.print(treeNode.val+" "); } public static TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre.length==0||pre.length==0){ return null; } //前序遍历的第一个节点即为根节点 return getTreeNode(pre,0,pre.length-1,in,0,in.length-1); } private static TreeNode getTreeNode(int [] pre,int p_start,int p_end,int [] in,int i_start,int i_end){ if(p_start>=0&&i_start>=0&&p_end<pre.length&&i_end<in.length&&i_start <=i_end&&p_start<=p_end){ TreeNode treeNode=new TreeNode(pre[p_start]); if(p_start==p_end) return treeNode; int index=getIndex(pre[p_start], in, i_start, i_end); int l_left=index-i_start; treeNode.left = getTreeNode(pre,p_start+1,p_start+l_left,in,i_start,i_start+l_left-1); treeNode.right = getTreeNode(pre,p_start+l_left+1,p_end,in,i_start+l_left+1,i_end); return treeNode; }else{ return null; } } private static int getIndex(int k,int [] in,int i_start,int i_end){ for(int i=i_start;i<=i_end;i++){ if(in[i]==k) return i; } return -1; } }
相关文章推荐
- 剑指offer-重建二叉树
- 剑指Offer-7:重建二叉树
- 剑指offer:重建二叉树(java)
- 剑指offer 6 重建二叉树
- 剑指Offer之重建二叉树
- 剑指offer-面试题6.重建二叉树
- 剑指offer之重建二叉树
- 【剑指Offer】重建二叉树 解题报告(Java & Python)
- 【剑指offer】如何通过先序遍历与中序遍历重建二叉树
- 【剑指offer】重建二叉树
- 剑指offer之重建二叉树
- 剑指offer-二叉树的重建
- 剑指offer--面试题6 重建二叉树
- [牛客网,剑指offer,python] 重建二叉树
- 【剑指offer】面试题6:重建二叉树
- 剑指Offer面试题6(Java版):重建二叉树
- 剑指offer之面试题6重建二叉树
- 牛客网 - 剑指Offer - 考点:树 题目:重建二叉树
- 【剑指Offer面试题】 九度OJ1385:重建二叉树
- 剑指offer面试题5-从尾到头打印链表/6-重建二叉树