剑指offer--(4) 重建二叉树

来源:互联网 发布:张逗张花 知乎 编辑:程序博客网 时间:2024/06/07 07:44

剑指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;           }}
原创粉丝点击