二叉树day3

226. 翻转二叉树

还是层序遍历,把子节点翻转一下就可以。

class Solution {
    public TreeNode invertTree(TreeNode root) {
        Deque<TreeNode> queue = new LinkedList<>();
        if (root != null) queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode cur = queue.poll();
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
                reverseDescendant(cur);
            }
        }
        return root;
    }
    private void reverseDescendant(TreeNode node) {
        TreeNode t = node.left;
        node.left = node.right;
        node.right = t;
    }
}

递归亦可以实现,前序和后序比较适合解决此题。

//DFS 1.递归 后序
class Solution {
    public TreeNode invertTree(TreeNode root) {
       if  (root == null) return null;
       //左右中
       invertTree(root.left);
       invertTree(root.right);
       reverseDescendant(root);
       return root; 
    }
    private void reverseDescendant(TreeNode node) {
       TreeNode t = node.left;
       node.left = node.right;
       node.right = t;
    }
}

 迭代前序

//DFS 2.迭代 前序
class Solution {
    public TreeNode invertTree(TreeNode root) {
       Deque<TreeNode> stack = new LinkedList<>();
       if (root != null) stack.push(root);
       while (!stack.isEmpty()) {
           TreeNode cur = stack.pop();
           reverseDescendant(cur); //中
           //压栈右左, 出栈左右
           if (cur.right != null) stack.push(cur.right);
           if (cur.left != null) stack.push(cur.left);
       }
       return root;
    }
    private void reverseDescendant(TreeNode node) {
        TreeNode t = node.left;
        node.left = node.right;
        node.right = t;
    }
}

 

101. 对称二叉树

//左子树遍历方式:左右中;右子树遍历方式:右左中
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return compare(root.left, root.right);
    }
    private boolean compare(TreeNode left, TreeNode right) {
        if (left == null && right != null) return false;
        else if (left != null && right == null) return false;
        else if (left == null && right == null) return true;
        else if (left.val != right.val) return false;
        else return (compare(left.left, right.right) && compare(left.right, right.left));
    }
}

一入递归深似海,从此offer是路人。明天继续写迭代。

参考:代码随想录:programmercarl.com

posted @ 2022-03-28 16:50  一梦两三年13  阅读(27)  评论(0)    收藏  举报