剑指offer------Day2

Posted Recently 祝祝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer------Day2相关的知识,希望对你有一定的参考价值。

之前写了一篇文章,当时想都没想发到一个群里,当我想撤回的时候,已经撤不回了,啥时候张小龙能普及微信管理员能测回超过两分钟的群消息就好了,然后看到一共同事看着我的文章再截图,当时我的心理(不要挂着一张囧字脸)。就是你没有心眼,但是在职场上还是不能随便说啥好一些,这件事让我对同事看到我的文章耿耿于怀,然后就不想分享了。就当做思路收集了。

Day2:剑指 Offer 07. 重建二叉树

力扣链接:剑指 Offer 07. 重建二叉树

我特别的恐慌二叉树,手写还行,像啥前序遍历呀,后续遍历呀,中序遍历啥的都OK,就是一开始学习数据结构的时候老师给我的心理阴影太大了,然后身边一群同学都说啥好难呀好难呀,其实你真的接触了之后,诶,也就那么回事儿。

题目:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

题解:递归的方式解决问题,前序遍历第一个值是根节点,根据根节点把中序遍历分为左子树,右子树。根据下边规则,然后递归左子树,递归右子树。根

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x)  val = x; 
 * 
 */
class Solution 
  // 缓存中序遍历数组每个值对应的索引
   Map< Integer, Integer > map = new HashMap();
    public TreeNode buildTree(int[] preorder, int[] inorder) 
        if(preorder == null || preorder.length <= 0)
            return null;
        
        // 简历中序遍历数组的映射(就是为了快速求出某个元素的下标)
        for(int i = 0; i < inorder.length; i++) 
            map.put(inorder[i], i);
        

        TreeNode root = f(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);

        return root;
    

    TreeNode f(int[] preorder, int l1, int r1, int[] inorder, int l2, int r2) 
        // 前序遍历或者中序遍历为空时,表示这棵树不存在,直接返回 null
        if( l1 > r1 || l2 > r2)
            return null;
        
        // 根节点
        TreeNode root = new TreeNode(preorder[l1]);
        // 根节点在中序遍历中的下标
        int i = map.get(preorder[l1]);
        // 递归求解
        root.left = f(preorder, l1 + 1, l1 + (i - l2), inorder, l2, i - 1);
        root.right = f(preorder, l1 + (i - l2) + 1, r1, inorder, i + 1, r2);

        return root;
    

Day2:剑指 Offer 09. 用两个栈实现队列

力扣链接:剑指 Offer 09. 用两个栈实现队列

做提前一定要先看几遍题目,不然就会像我一样偶尔把提意弄错,然后思考好久。

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

题解:利用栈的思维实现队列的两个方法,通过模拟,建立两个栈,第一个栈将所有元素入队,后出队到第二个栈,(所以再队列尾部添加元素的思路就是再栈一种添加元素,然后再出队),第二个栈出队顺序就跟队列相同了。删除(若stack2有元素,则stack2全部出队后,再将stack1元素入队,stack2再出)

class CQueue 

    Stack<Integer> stack1;
    Stack<Integer> stack2;
    public CQueue() 
        stack1 = new Stack();
        stack2 = new Stack();
    
    
    //加入尾部
    public void appendTail(int value) 
        stack1.push(value);
    
    
    public int deleteHead() 
        if(!stack2.isEmpty())
            return stack2.pop();
        
        if(!stack1.isEmpty())
            while(!stack1.isEmpty())
                stack2.push(stack1.pop());
        
        return stack2.pop();
    
     return -1;
 

End》》》
无人约束的生活,需要越自律才是真相!!!

以上是关于剑指offer------Day2的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer------Day2

剑指offer 24:二叉搜索树的后序遍历序列

剑指Offer16 判断子树

剑指offer系列47:堆成的二叉树

剑指Offer07 重建二叉树

剑指offer树的子结构