代码随想录刷题Day19

69 阅读1分钟
  1. 226. 翻转二叉树
  • 递归(DFS)
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //终止条件,节点为空
        if(root==null){
            return root;
        }
        //交换当前节点的左右子树
        TreeNode tmp = root.right;
        root.right=root.left;
        root.left=tmp;
        //继续交换下一层左右子树
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}
  • 迭代(BFS)
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null){
            return root;
        }
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode node= queue.poll();
            TreeNode tmp=node.left;
            node.left=node.right;
            node.right=tmp;
            if(node.left!=null){
                queue.add(node.left);
            }
            if(node.right!=null){
                queue.add(node.right);
            }
        }
        return root;
    }
}
  1. 101. 对称二叉树
  • 递归DFS
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return true;
        }
        return dfs(root.left,root.right);
    }
    public boolean dfs(TreeNode left,TreeNode right){
        //终止条件 两个节点都为空/有一个节点为空/两个节点值不相等
        if(left==null&&right==null){
            return true;
        }
        if(left==null||right==null){
            return false;
        }
        if(left.val!=right.val){
            return false;
        }
        //递归比较 左节点的左孩子和右节点的右孩子  以及 左节点的右孩子和右节点的左孩子
        return dfs(left.left,right.right)&&dfs(left.right,right.left);
    }
}
  • 迭代BFS
    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return true;
        }
        Queue<TreeNode> queue= new LinkedList<>();//LinkedList可以入队null,ArrayDeque不行会报错
        queue.add(root.left);
        queue.add(root.right);
        while(!queue.isEmpty()){
            TreeNode left = queue.poll();
            TreeNode right= queue.poll();
            //两个节点为null的时候继续循环,只有一个为空或不相等的时候返回false
            if(left==null&&right==null){
                continue;
            }
            if(left==null||right==null){
                return false;
            }
            if(left.val!=right.val){
                return false;
            }
            //把左节点的左孩子,右节点的右孩子放进队列
            queue.add(left.left);
            queue.add(right.right);
            //把左节点的右孩子,右节点的左孩子放进队列
            queue.add(left.right);
            queue.add(right.left);
        }
        return true;
    }
}