代码随想录刷题Day 14 二叉树part02

226. 翻转二叉树

//这道题其实就是遍历二叉树,然后交换每个节点的左右子节点即可。这里我就使用了一个栈来存储需要遍历的节点,每次循环弹出一个,然后交换其左右子节点就好了
class Solution {
    public TreeNode invertTree(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        if(root == null) return root;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            if(tmp.left != null) stack.push(tmp.left);
            if(tmp.right != null) stack.push(tmp.right);
            TreeNode t = tmp.left;
            tmp.left = tmp.right;
            tmp.right = t;
        }
        return root;
    }
}

101. 对称二叉树

class Solution {  //我这个写法有点丑陋,后面会给出更好的解法
    public boolean isSymmetric(TreeNode root) {
        List<Integer> levelVal = new ArrayList<>();  //相当于层序遍历,把一层的所有值存起来,如果对应位置为null,则填充一个不可能是真正节点值的一个数字,最后判断这层的值是否是对称的即可
        if(root == null) return true;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i = 0; i < size; i++){ //遍历当前层,填充下一层的值
                TreeNode tmp = queue.poll();
                if(tmp.left != null) {queue.offer(tmp.left); levelVal.add(tmp.left.val);}
                else{ levelVal.add(-200); }  //没有左孩子,则在左孩子的位置填一个非法值
                if(tmp.right != null) {queue.offer(tmp.right); levelVal.add(tmp.right.val);}
                else{ levelVal.add(-200); }  //同理
            }
            if(!isSymmetricLevel(levelVal)) return false;
            levelVal.clear(); //记得要清空
        }
        return true;
    }

    public boolean isSymmetricLevel(List<Integer> levelVal){
        ArrayList<Integer> reverse = new ArrayList();
        for(Integer i: levelVal){
            reverse.add(0, i);
        }
        return levelVal.equals(reverse);
    }
}

怎么理解题意中的对称呢,对于递归版本中,我是这么理解的,其实位于对应对称位置处的节点必须相同。比如对于第二层而言,两个2位置处的节点相同;对于第三层,则是两个3位置处节点相同,两个4处相同。这个相同指的是可以都是null或者两者的val必须相同。

class Solution {  //递归版本题解,确实优雅
    
    public boolean isSymmetric(TreeNode root) {
        if(root == null) return true;
        return compare(root.left, root.right); //比较对应位置处节点是否完全相同
    }

    public boolean compare(TreeNode left, TreeNode right){
        if(left == null && right == null) return true;
        if(left == null && right != null || left != null && right == null) return false;
        if(left.val != right.val) return false;
        boolean b1 = compare(left.left, right.right);  //比较外侧的对称位置
        boolean b2 = compare(left.right, right.left);  //比较内测的对称位置
        return b1 && b2;
    }
}
posted @ 2024-07-16 22:50  12点不睡觉还想干啥?  阅读(16)  评论(0)    收藏  举报