力扣题型总汇——二叉树

二叉树总结

1、解题方法共两种:

①深度优先查找(DFS——Depth First Search)

②广度优先查找(BFS——Breadth First Search)

2、深度优先查找——使用递归来进行解题

递归的解题三部曲: 

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。终止条件的形式有两种:

    主动终止[方法的开始进行判断if]
    if(root==null) return ;
    被动终止[方法的最后返回值return ]
    return XXX;
  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。在写递归函数的时候,把二叉树看成只有root、root.left、root.right三个结点即可。

  4. ☆☆☆在写完终止条件,就是递归的写法,递归要么直接递归,要么进行if条件判断里递归

    //1.在写完终止条件后进行递归
    preOrder(root.left);
    
    //2.在写完终止条件后进行递归
    int max=preOrder(root.left);
    
    //3.在写完终止条件后if判断里递归
    if(val<root.val){
        root.left=preOrder(root.left,val);
    }

3、广度优先查找——使用队列进行层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

        在层序遍历中,如果内层的循环是while(size>0)的话,那么这个循环内一定会size--;
如果内存的循环是for(int i=0;i<size;i++)的话,那么不用写size--;且用到for循环的话,一定是要用上i这个变量,不然的话基本都用while就可以解决。因为size--;的目的是为了终止每一次的while循环而存在的。因为层序遍历如果有3层的话,要循环3次内循环

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>>res=new ArrayList<>();
        Queue<TreeNode>queue=new LinkedList<>();
        if(root==null) return res;
        queue.offer(root);
        while(!queue.isEmpty()){
            int len=queue.size();
            List<Integer>list=new ArrayList<>();
            while(len>0){
                TreeNode temp=queue.poll();
                list.add(temp.val);
                if(temp.left!=null) queue.offer(temp.left);
                if(temp.right!=null) queue.offer(temp.right);
                len--;
            }
            res.add(list);
        }
        return res;
    }
}


题目:

二叉树入门基础——包含递归和迭代两种解法(DFS和BFS)

Day6:144二叉树的前序遍历

Day5:94二叉树的中序遍历

Day6:145二叉树的后序遍历


N叉树入门基础 

Day33:559N 叉树的最大深度 

Day33:589N 叉树的前序遍历

Day88:590N 叉树的后序遍历

Day88:429N 叉树的层序遍历

Day81:386字典序排数(十叉树的遍历)


深度遍历DFS

Day5:100相同的树

Day5:101对称二叉树

Day7:104二叉树的最大深度

Day7:108将有序数组转换为二叉搜索树

Day7:110平衡二叉树

Day8:111二叉树的最小深度

Day8:112路径总和

Day16:226翻转二叉树

Day18:235二叉搜索树的最近公共祖先

Day18:257二叉树的所有路径

Day28:501二叉搜索树中的众数

Day28:530二叉搜索树的最小绝对差

Day32:543二叉树的直径

Day59:653两数之和 IV - 输入 BST

Day85:1305两棵二叉搜索树中的所有元素

Day87:236二叉树的最近公共祖先

Day88:113路径总和 II

Day89:606根据二叉树创建字符串 

Day90:98验证二叉搜索树

Day90:450删除二叉搜索树中的节点

Day90:701二叉搜索树中的插入操作 


广度遍历BFS

Day85:102二叉树的层序遍历

Day85:513找树左下角的值 

Day86:103二叉树的锯齿形层序遍历 

Day86:107二叉树的层序遍历 II


构造二叉树 

Day86:105从前序与中序遍历序列构造二叉树 

Day87:106从中序与后序遍历序列构造二叉树


(草稿)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值