代码随想录-2023/07/11

74 阅读1分钟

二叉树的层序遍历

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.翻转二叉树

解题思路: 遍历树节点---交换每个节点的左右子节点即可

  1. 递归
  2. 层序遍历

代码:

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;
    }
}