• 剑指offer07-09


    剑指offer07-09

    1.重建二叉树

     方法1:

     1 public static TreeNode buildTree(int[] preorder,int[] inorder){
     2         //非递归的方法
     3         Stack<TreeNode> stack = new Stack<>();
     4         int index = 0;
     5         TreeNode tempNode = null;
     6 
     7 
     8 
     9         while(index<preorder.length){
    10             if(stack.empty()){
    11                 stack.push(new TreeNode(preorder[index]));
    12                 index++;
    13                 continue;
    14             }else{
    15                 tempNode = stack.peek();
    16                 stack.push(new TreeNode(preorder[index]));
    17 
    18                 if(getIndex(inorder,tempNode.val)<getIndex(inorder,preorder[index])){
    19                     System.out.println("父节点:"+tempNode.val+"右孩子:"+stack.peek().val);
    20                     tempNode.right = new TreeNode(preorder[index]);
    21                 }else{
    22                     System.out.println("父节点:"+tempNode.val+"左孩子:"+stack.peek().val);
    23                     tempNode.left = new TreeNode(preorder[index]);
    24                 }
    25             }
    26 
    27             if(getIndex(inorder,stack.peek().val)==0&&getIndex(preorder,inorder[getIndex(inorder,stack.peek().val)+1])<index){
    28                 System.out.println("节点"+stack.peek().val+"出栈");
    29                 stack.pop();
    30 
    31             }
    32             else if(getIndex(inorder,stack.peek().val)==inorder.length-1&&getIndex(preorder,inorder[getIndex(inorder,stack.peek().val)-1])<index) {
    33                 System.out.println("节点"+stack.peek().val+"出栈");
    34                 stack.pop();
    35 
    36             }
    37             else if(getIndex(preorder,inorder[getIndex(inorder,stack.peek().val)+1])<index||getIndex(preorder,inorder[getIndex(inorder,stack.peek().val)-1])<index) {
    38                 System.out.println("节点"+stack.peek().val+"出栈");
    39                 stack.pop();
    40             }
    41             index ++;
    42 
    43         }
    44         while(stack.size()>1) stack.pop();
    45         TreeNode root = stack.pop();
    46         //TreeNode root = null;
    47         System.out.println(root.val);
    48         return root;
    49     }
    50 
    51     public static int getIndex(int[] arr,int target){
    52         for (int i = 0; i < arr.length; i++) {
    53             if(arr[i] == target) return i;
    54         }
    55         return -1;
    56     }

    2.用两个栈来实现队列

     方法1:

     1 class CQueue{
     2 
     3     // 用两个栈来实现队列
     4     Stack<Integer> stackFirst;
     5     Stack<Integer> stackSecond;
     6 
     7     public CQueue(){
     8         stackFirst = new Stack<>();
     9         stackSecond = new Stack<>();
    10 
    11 
    12     }
    13 
    14     public void appendTail(int value){
    15         stackFirst.push(value);
    16     }
    17 
    18     public int deleteHead(){
    19         if(stackFirst.empty()) return -1;
    20         while(!stackFirst.empty()) stackSecond.push(stackFirst.pop());
    21         int re = stackSecond.pop();
    22         while(!stackSecond.empty()) stackFirst.push(stackSecond.pop());
    23         return re;
    24     }
    25 }

    第一栈用来存放数据,第二个栈用来辅助,当需要对队首操作时就将第一栈中的数据分别pop,然后push到第二个栈里面,然后处理。

    知之为知之,不知为不知
  • 相关阅读:
    HTML5第二节
    HTML5在移动端开发的12大特性
    移动端开发遇到的坑
    html5 meta(移动端)介绍及使用
    CSS的margin塌陷(collapse)
    Block Demo
    设计模式之代理
    OC Block网上转载
    GCD之全局、主线程
    Spark SQL中 RDD 转换到 DataFrame
  • 原文地址:https://www.cnblogs.com/bevishe/p/12318482.html
Copyright © 2020-2023  润新知