二叉树总结
1、解题方法共两种:
①深度优先查找(DFS——Depth First Search)
②广度优先查找(BFS——Breadth First Search)
2、深度优先查找——使用递归来进行解题
递归的解题三部曲:
-
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
-
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。终止条件的形式有两种:
主动终止[方法的开始进行判断if] if(root==null) return ; 被动终止[方法的最后返回值return ] return XXX;
-
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。在写递归函数的时候,把二叉树看成只有root、root.left、root.right三个结点即可。
-
☆☆☆在写完终止条件,就是递归的写法,递归要么直接递归,要么进行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从中序与后序遍历序列构造二叉树
(草稿)