剑指offer之重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

解析:

/** 

Definition for binary tree
 *
public class TreeNode 
{ * int val; 
* TreeNode left; 
* TreeNode right;
 * TreeNode(int x) 
 { val = x; } * 
 */ 
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) 

//判断数组是否为空以及不相等
if(pre == null || in == null || pre.length == 0 || in.length == 0 || pre.length != in.length)

return null;

//调用递归
return rebuildTree(pre, 0, pre.length - 1, in, 0, in.length - 1); 

//重建左右子树   递归传值给i j m n时要先画图确定其在左右子树的下标
public TreeNode rebuildTree(int[] pre, int i, int j, int[] in, int m, int n)

int rootVal = pre[i];
//找到根节点的位置下标
int index = findroot(rootVal, in, m, n);
 if(index < 0)

    return null;
 } 
 //确定左右结点的个数 每次都会以新的数组序列进行
int leftNodes = index - m, rightNodes = n - index; 
//赋值根节点
TreeNode root = new TreeNode(rootVal); 
if(leftNodes == 0)
{
    root.left = null;
 }
else

//重建左子树 i为上一次保留的值  具体看是构建左边还是右边子树
    root.left = rebuildTree(pre, i + 1, i + leftNodes, in, m, m + leftNodes - 1);
 }
 if(rightNodes == 0)
 { 
    root.right = null; 
}
 else
 { 
//重建右子树
    root.right = rebuildTree(pre, i + leftNodes + 1, j, in, n - rightNodes + 1, n); 
    } 
   return root; 
 }
 //每次都会调用这个函数来找到根节点下标
 public int findroot(int target, int tes[], int start, int end){
     for(int i = start ; i <= end ; i++)
     { if(tes[i] == target)
      { 
         return i; //返回下标
       }
     } 
     //不存在就返回负一
     return -1;
 } 
    
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值