代码随想录刷题记录day14
leetcode:102. 二叉树的层序遍历
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XY1szDgT-1668011404967)(代码随想录刷题.assets/image-20221109231327615.png)]
思想
借助队列来实现层序遍历,也叫做广度优先遍历
需要记录队列的大小,刚开始把根节点推入栈
记录根节点,根节点出队,再把根节点的左右节点加入队列
代码
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> que=new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int size=que.size();
List<Integer> temp=new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node=que.peek();
temp.add(node.val);
que.poll();
if(node.left!=null) que.offer(node.left);
if(node.right!=null) que.offer(node.right);
}
// System.out.println(temp);
res.add(temp);
}
// System.out.println(res);
return res;
}
}
leetcode: 226. 翻转二叉树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFwVURBi-1668011404968)(代码随想录刷题.assets/image-20221109223534951.png)]
思想:
1.前序遍历 或者后序遍历都可,具体流程如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpZACvdJ-1668011404968)(代码随想录刷题.assets/image-20221109230234616.png)]
2.迭代法 用一个栈来模拟递归的过程
代码
递归法
class Solution {
public boolean isSymmetric(TreeNode root) {
return helper(root.left,root.right);
}
public boolean helper(TreeNode left_node,TreeNode right_node){
//判断左孩子和右孩子是否相同 左孩子的左节点和 右孩子的右节点是否相同
if(left_node==null && right_node!=null)return false;
else if(left_node!=null && right_node==null) return false;
else if(left_node==null && right_node==null) return true;
else if(left_node.val!=right_node.val){
return false;
}
// if(left_node.left.val!=right_node.right.val || left_node.right.val != right_node.left.val){
// return false;
// }
return helper(left_node.left,right_node.right)&& helper(left_node.right,right_node.left);
}
}
迭代法
public TreeNode invertTree(TreeNode root) {
//递归 交换左节点和右节点 然后对左节点执行相同的操作
//迭代法
Stack<TreeNode> stack=new Stack<>();
stack.push(root);
while(!stack.empty()){
TreeNode top= stack.peek();
stack.pop();
TreeNode temp= top.left;
top.left=top.right;
top.right=temp;
if(top.left!=null) stack.push(top.left);
if(top.right!=null) stack.push(top.right);
}
return root;
}
leetcode 101. 对称二叉树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YL7VufJI-1668011404968)(代码随想录刷题.assets/image-20221109221909149.png)]
思想:
采用后序遍历,先判断左右子节点是否相等,再往上返回
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWLUSlGn-1668011404969)(代码随想录刷题.assets/image-20221109223424047.png)]
class Solution {
public boolean isSymmetric(TreeNode root) {
return helper(root.left,root.right);
}
public boolean helper(TreeNode left_node,TreeNode right_node){
//判断左孩子和右孩子是否相同 左孩子的左节点和 右孩子的右节点是否相同
if(left_node==null && right_node!=null)return false;
else if(left_node!=null && right_node==null) return false;
else if(left_node==null && right_node==null) return true;
else if(left_node.val!=right_node.val){
return false;
}
// if(left_node.left.val!=right_node.right.val || left_node.right.val != right_node.left.val){
// return false;
// }
return helper(left_node.left,right_node.right)&& helper(left_node.right,right_node.left);
}
}