二叉树的层序遍历
102.二叉树的层序遍历
用队列模拟, 每次遍历到下一层时, 将上一层节点全部出队, 然后依次记录其值, 并将其子节点入队
代码:
class Solution {
// 层序遍历用栈模拟
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if(root == null) return ans;
Deque<TreeNode> deque = new ArrayDeque<>();
deque.push(root);
while(!deque.isEmpty()) {
int size = deque.size();
List<Integer> list = new ArrayList<>();
while(size-- > 0){
TreeNode t = deque.pollFirst();
list.add(t.val);
if(t.left != null) deque.offerLast(t.left);
if(t.right != null) deque.offerLast(t.right);
}
ans.add(list);
}
return ans;
}
}
226.翻转二叉树
解题思路: 遍历树节点---交换每个节点的左右子节点即可
- 递归
- 层序遍历
代码:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
Deque<TreeNode> deque = new ArrayDeque<>();
deque.offerLast(root);
// 层序遍历---交换每个节点的左右子节点即可
while(!deque.isEmpty()) {
TreeNode curr = deque.pollFirst();
swap(curr);
if(curr.right != null) deque.offerLast(curr.right);
if(curr.left != null) deque.offerLast(curr.left);
}
return root;
}
// 交换当前节点的左右子节点
public void swap(TreeNode curr) {
TreeNode temp = curr.left;
curr.left = curr.right;
curr.right = temp;
}
}
101.对称二叉树
按照需要比较的相等位置装入, 每次取出连续两个元素(即之前装入的对应位置的元素)比较, 不相等直接返回 false
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null || (root.left==null && root.right==null)){
return true;
}
// 轴对称---每层节点从左向右和从右向左是一样的
// ArrayDeque 不允许装入null, LinkedList允许装入null
Deque<TreeNode> deque = new LinkedList<>();
deque.offerLast(root.left);
deque.offerLast(root.right);
while(!deque.isEmpty()) {
TreeNode left = deque.pollFirst();
TreeNode right = deque.pollFirst();
if(left == null && right == null) {
continue;
}else if(left == null) {
return false;
}else if(right == null) {
return false;
}else if(left.val != right.val){
return false;
}
deque.offerLast(left.left);
deque.offerLast(right.right);
deque.offerLast(left.right);
deque.offerLast(right.left);
}
return true;
}
}