102. 二叉树的层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1] 输出:[[1]]
示例 3:
输入:root = [] 输出:[]
提示:
[0, 2000]
内-1000 <= Node.val <= 1000
思路:层序遍历相当于图论中的广度优先,一层一层的去遍历树中的元素,在此使用队列的结构进行层序遍历算法的实现
使用队列进行层序遍历的核心在于,提前确定好该层的元素,然后提前把下一层的所有元素入队,最后按规定好的元素个数出队即可
下面是代码演示
public List> levelOrder(TreeNode root) {
//使用队列解题
Queue queue = new LinkedList<>();
List> res = new ArrayList<>();
if(root != null)queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
List list = new ArrayList<>();//
//根据size的数值进行弹出
while(size != 0){
size--;
TreeNode temp = queue.remove();
if(temp != null){
list.add(temp.val);
if(temp.left !=null)queue.add(temp.left);
if(temp.right !=null)queue.add(temp.right);
}
}
res.add(list);
}
return res;
}
226. 翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
提示:
[0, 100]
内-100 <= Node.val <= 100
思路:这一题我们首先要确定的是要使用哪一种方式去遍历树中节点进行操作,实际上三种方式都是可以的,推荐使用前后序进行遍历,中序的话绕一些,但也是可以的,确定好了遍历方式其实这题一眼就能看出来怎么写了
可以通过中左右的遍历方式对子树元素进行一一交换,也就是前序遍历,代码如下
//前序遍历(后序遍历同理)
public void preorder(TreeNode root){
if(root == null){
return;
}
TreeNode temp = root.left;//1.中间节点完成交换
root.left = root.right;
root.right = temp;
preorder(root.left);//2.左节点完成交换
preorder(root.right);//3.右节点完成交换
}
//中序遍历
public void preorder2(TreeNode root){
if(root == null){
return;
}
preorder(root.left);//1.左节点完成交换
TreeNode temp = root.left;//2.中间节点完成交换
root.left = root.right;
root.right = temp;
//3.因为左右子节点已经交换过了,所以原本的右节点现在在左边,所以现在处理左节点
preorder(root.left);
}
101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
[1, 1000]
内-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
思考:
本题我们首先要思考的也应该是用什么样的遍历方式去遍历整个树进行操作,到底前中后序该用哪一个呢?
本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。
但都可以理解算是后序遍历,尽管已经不是严格上在一个树上进行遍历的后序遍历了。
public boolean isSymmetric(TreeNode root) {
if(root ==null){
return true;
}
return compare(root.left,root.right);
}
//1.确定返回的数据类型以及传入的参数
public boolean compare(TreeNode left ,TreeNode right){
//2.确定循环结束的条件
if(left==null && right !=null)return false;//一有一空的情况
else if(left!=null && right ==null)return false;
else if(left==null && right ==null)return true;
else if(left.val != right.val)return false;
//3.确定单层递归的逻辑
boolean outsize = compare(left.left,right.right);
boolean insize = compare(left.right,right.left);
return outsize && insize;
}
这就是今天的练习内容,感谢大家的观看!