剑指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》》》
无人约束的生活,需要越自律才是真相!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Recently 祝祝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值