剑指offer——重建二叉树

思路迭代

  • 自己想的笨方法:从前序遍历入手,一个一个分析,结合中序里的情况,虽然笨,但是还是有效。
  • 别人的好方法:一句话表达,子树的根节点就是树的左右节点

代码展示

笨办法

public class Solution {
   public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       Boolean flag = true;
       int int_pre,int_pro;
       TreeNode tree_pre,tree_pro;
       TreeNode first = new TreeNode(pre[0]);
       int first_loc = loc(pre[0],in);
       int len = pre.length;
       TreeNode tmp_1= null,tmp_2= null;
       int in_loc_1=0,in_loc_2=0;
       for (int i =1;i< len ; i++){
           if (i == 1){
               tmp_1 = first;
               in_loc_1 = first_loc;
           }
           int pre_val = pre[i];

           if (i%2 == 0){
               tmp_1 = new TreeNode(pre_val);
               in_loc_1 = loc(pre_val,in);
               flag = true;
           }
           else {
               tmp_2 = new TreeNode(pre_val);
               in_loc_2 = loc(pre_val,in);
               flag = false;
           }
           if (flag){
               int_pre = in_loc_2;
               int_pro = in_loc_1;
               tree_pre = tmp_2;
               tree_pro = tmp_1;

           }
           else {
               int_pre = in_loc_1;
               int_pro = in_loc_2;
               tree_pre = tmp_1;
               tree_pro = tmp_2;
           }
           if (int_pre > int_pro){
               tree_pre.left = tree_pro;

           }
           else if (int_pre < int_pro){

               int father_val = in[father_val(int_pro,i,in,pre)];

               //find(father_val,tree_pro,first);
               bianli(first,father_val,tree_pro);
           }
       }
       return first;
   }
   private static int father_val(int int_pro,int now,int [] in,int [] pre){
       for (int i = int_pro - 1;i>=0;i--){
           for (int j = 0;j<now;j++){
               if (in[i] == pre[j]){
                   return i;
               }
           }
       }
       return -1;
   }

   private static int loc(int val,int [] in){
       for (int i=0; i< in.length;i++){
           if (in[i] == val){
               return i ;
           }
       }
       return -1;
   }

   private static void bianli(TreeNode it,int val,TreeNode right){
       if (it != null) {

           if (it.val == val) {
               it.right = right;
           }
           bianli(it.left, val,right);

           bianli(it.right, val,right);

       }
   }

   public static void main(String[] args){
       int c1[] = {1,2,3,4,5,6,7};
       int c2[] = {3,2,4,1,6,5,7};
       TreeNode it  = reConstructBinaryTree(c1,c2);
       System.out.println(it.val);
   }
}

class TreeNode {
   int val;
   TreeNode left;
   TreeNode right;
   TreeNode(int x) { val = x; }
}

好方法

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
        return root;
    }
 
    private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) {
         
        if(startPre>endPre||startIn>endIn)
            return null;
        TreeNode root=new TreeNode(pre[startPre]);
         
        for(int i=startIn;i<=endIn;i++)
            if(in[i]==pre[startPre]){
                root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
                root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
                      break;
            }
                 
        return root;
    }
}

思考

关于递归的return

正确

public int digui (){
	while()   return digui();
	return ;
}

错误

错误的返回的是最外层的return 的值

public int digui(){
	while () digui();
	return ;
}

关于二叉树

三种遍历其实很简单:

  • 先根再左后右 前序
  • 先左再根后右 中序
  • 先左再右后根 后序
内容概要:本文详细介绍了施耐德M580系列PLC的存储结构、系统硬件架构、上电写入程序及CPU冗余特性。在存储结构方面,涵盖拓扑寻址、Device DDT远程寻址以及寄存器寻址三种方式,详细解释了不同类型的寻址方法及其应用场景。系统硬件架构部分,阐述了最小系统的构建要素,包括CPU、机架和模块的选择与配置,并介绍了常见的系统拓扑结构,如简单的机架间拓扑和远程子站以太网菊花链等。上电写入程序环节,说明了通过USB和以太网两种接口进行程序下载的具体步骤,特别是针对初次下载时IP地址的设置方法。最后,CPU冗余部分重点描述了热备功能的实现机制,包括IP通讯地址配置和热备拓扑结构。 适合人群:从事工业自动化领域工作的技术人员,特别是对PLC编程及系统集成有一定了解的工程师。 使用场景及目标:①帮助工程师理解施耐德M580系列PLC的寻址机制,以便更好地进行模块配置和编程;②指导工程师完成最小系统的搭建,优化系统拓扑结构的设计;③提供详细的上电写入程序指南,确保程序下载顺利进行;④解释CPU冗余的实现方式,提高系统的稳定性和可靠性。 其他说明:文中还涉及一些特殊模块的功能介绍,如定时器事件和Modbus串口通讯模块,这些内容有助于用户深入了解M580系列PLC的高级应用。此外,附录部分提供了远程子站和热备冗余系统的实物图片,便于用户直观理解相关概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值