层序遍历
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
思路
1.层序遍历
定义一个用于保存层序遍历结果的变量res,和用于操作的队列。
首先将根节点加入队列里。
接下来当队列不为空的时候循环。定义一个保存该层元素的集合list,和记录队列大小(该层数量)的变量(levelsize)。
然后用一个for循环遍历将该层遍历一遍,保存队列中左边(First)的元素,然后加入队列并删除,接着保存该元素的左右孩子
出了for循环后将list加入res中
2.反转
后用for循环将res倒着遍历(get)加入新定义的集合result
代码
方法
poll() 得到并返回头元素
peek() 查看并返回
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
Deque<TreeNode>que=new LinkedList<>();
if(root==null)return res;
que.offerLast(root);
while(!que.isEmpty()){
List<Integer>list=new ArrayList<>();
int levelsize=que.size();//记录该层有几个元素
for(int i=0;i<levelsize;i++){
TreeNode peek=que.peekFirst();
list.add(que.pollFirst().val);
if(peek.left!=null){
que.offerLast(peek.left);
}
if(peek.right!=null){
que.offerLast(peek.right);
}
}
res.add(list);
}
List<List<Integer>>result=new ArrayList<>();
for(int i=res.size()-1;i>=0;i--){
result.add(res.get(i));
}
return result;
}
}
226.翻转二叉树(前序遍历)
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路
利用递归,在开头加上判断条件if root不为空。
注,swap方法必须放在前后位(前序遍历和后序遍历)。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null)return null;
swap(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void swap(TreeNode root){
TreeNode temp;
temp=root.left;
root.left=root.right;
root.right=temp;
}
}
101. 对称二叉树
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路
方法:后序遍历(递归)
需要收集左右孩子信息的题都用后序遍历
情况
左 右
空 有 f
有 空 f
空 空 t
有 有 比较 值不同 f
值相同 继续
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public boolean compare(TreeNode left,TreeNode right){
if(left==null&&right!=null)return false;
else if(right==null&&left!=null)return false;
else if(left==null&&right==null)return true;
else if(left.val!=right.val)return false;
//外侧
//内测
return compare(left.left,right.right)&&compare(left.right,right.left);
}
}
总结
学习了两个半小时,掌握了递归解这三道题的方法。