剑指Offer----重建二叉树 (java实现)

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

输入

前序遍历序列{1,2,4,7,3,5,6,8}

中序遍历序列{4,7,2,1,5,3,8,6}

则重建二叉树并返回。

 

定义:

前序遍历:根,左子树,右子树

中序遍历:左子树,根,右子树

 

首先想到是用递归去做。

preOredr: 1,[ 2,4,7 ] ,{ 3,5,6,8 }

inOrder:[ 4,7,2 ] ,1,{ 5,3,8,6}

根据二叉树遍历可以知道,中括号里面的是左子树,花括号里面的是右子树,

可以拿到leftpre,leftin 左子树的前序遍历,中序遍历,调用递归构建左子树。

右子树同理,rightpre,rightin右子树的前序遍历,中序遍历。

 

package com.xxxx;

/**
 * create by ziqiiii
 */
public class Test {

     //Definition for binary tree
     public static class TreeNode {
         int val;
         TreeNode left;
         TreeNode right;
         TreeNode(int x) { val = x; }
     }

    static public 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 h = reConstructBinaryTree(pre,in);

         preOrder(h);
        System.out.println("------");
        inOrder(h);
    }

    static public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
         int preLen = pre.length;
         int inLne = in.length;

         if(preLen == 0 || inLne == 0 || preLen != inLne){
             return null;
         }

         int f = pre[0];
         TreeNode root = new TreeNode(f);

         int leftNum=0;
         for(int i=0;i<inLne;i++){
             if(in[i]==f){
                 break;
             }
             leftNum++;
         }
         int rightNum = preLen - 1 - leftNum;


        int[] leftpre = new int[leftNum];
        int[] rightpre = new int[rightNum];
        int j = 1;
        for(int m=0;m<leftNum;m++){
            leftpre[m]=pre[j++];
        }

        for(int m=0;m<rightNum;m++){
            rightpre[m]=pre[j++];
        }

        int[] leftin = new int[leftNum];
        int[] rightin = new int[rightNum];
        j=0;
        for(int m=0;m<leftNum;m++){
            leftin[m]=in[j++];
        }
        j+=1;
        for(int m=0;m<rightNum;m++){
            rightin[m]=in[j++];
        }

        root.left=reConstructBinaryTree(leftpre,leftin);
        root.right=reConstructBinaryTree(rightpre,rightin);

        return root;
    }


    static void preOrder(TreeNode root){
         if(root != null){
             System.out.print(root.val);
             preOrder(root.left);
             preOrder(root.right);
         }
    }


    static void inOrder(TreeNode root){
        if(root != null){
            inOrder(root.left);
            System.out.print(root.val);
            inOrder(root.right);
        }
    }
}



为了验证构建的树是否正确,我用前序遍历 和中序遍历输出了一遍:

12473568------
47215386

 

与题目一致。

 

牛客网运行:

 

 

c++可参考:

https://github.com/gatieme/CodingInterviews/tree/master/006-%E9%87%8D%E5%BB%BA%E4%BA%8C%E5%8F%89%E6%A0%91

(港真,看别人的代码还不如自己按思路写一遍)

。。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值