10:重建二叉树

题目:重建二叉树

输入二叉树的前序遍历和中序遍历重构二叉树,树表示方式为链表
前序遍历:1 2 4 5 3 6 7 ,根-左-右 ,根节点:7,左子树:2 4 5,右子树:3 6 7
中序遍历:4 2 5 1 6 3 7 ,左-根-右 ,根节点:7,左子树:4 2 5,右子树:6 3 7

public class Offer10 {
   public static void main(String[] args) {
       int[] preorder = {1,2,4,5,3,6,7};
       int[] inorder = {4,2,5,1,6,3,7};
       PreorderTraversal(rebuildTree(preorder,inorder));
   }
   public static TreeNode rebuildTree(int[] preorder,int[] inorder){

       //先先序遍历构建根节点,再根据中序遍历确定左右子树的数量
       if (preorder==null||preorder.length==0)return null;
       
       TreeNode root = new TreeNode(preorder[0]);
       int index = searchRootIndex(preorder,inorder);
       //构建左子树
       //复制数组函数→前闭后开
       root.left = rebuildTree(Arrays.copyOfRange(preorder,1,index+1),
                               Arrays.copyOfRange(inorder,0,index));

       //构建右子树
       root.right = rebuildTree(Arrays.copyOfRange(preorder,index+1,preorder.length),
                               Arrays.copyOfRange(inorder,index+1,inorder.length));
       return root;
   }
   public static int searchRootIndex(int[] preorder,int[] inorder){
       for (int i = 0; i < inorder.length; i++) {
           if(inorder[i]==preorder[0])return i;
       }
       return -1;
   }

   //前序遍历
   public static void PreorderTraversal(TreeNode node){
       System.out.print(node.value+" ");
       if(node.left!=null)PreorderTraversal(node.left);
       if(node.right!=null)PreorderTraversal(node.right);
   }

}
class TreeNode {
   TreeNode left;
   TreeNode right;
   Integer value;

   public TreeNode(Integer value) {
       this.value = value;
   }

   public TreeNode(TreeNode left, TreeNode right, Integer value) {
       this.left = left;
       this.right = right;
       this.value = value;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值