Day14 | 226翻转二叉树&101对称二叉树&222完全二叉树的节点个数&110平衡二叉树

69 阅读1分钟

翻转二叉树 LeetCode 226

题目链接:[LeetCode 102 - 中等]

思路

沿着根节点,将左右的结点反转

迭代(借助队列):

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null)return root;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);

        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                TreeNode node = que.poll();
                if(node.left!=null && node.right!=null){
                    TreeNode tmp = node.left;
                    node.left = node.right;
                    node.right = tmp;
                    que.offer(node.left);
                    que.offer(node.right);
                }else if(node.left!=null){
                    node.right=node.left;
                    node.left = null;
                    que.offer(node.right);
                }else if(node.right!=null){
                    node.left=node.right;
                    node.right=null;
                    que.offer(node.left);
                }
                len--;
            }
        }
        return root;
    }
}

对称二叉树 LeetCode 101

题目链接:[LeetCode 101 - 简单]

思路

两种方式:递归and遍历 三种判断非对称二叉树的可能性:①左子树为空②右子树为空③左右子树的数值不一致

迭代(借助队列):

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null)return true;
        Deque<TreeNode> que = new LinkedList<>();
        que.offerFirst(root.left);
        que.offerLast(root.right);
        while(!que.isEmpty()){
            TreeNode leftNode = que.pollFirst();
            TreeNode rightNode = que.pollLast();
            if(leftNode==null && rightNode==null){
                continue;
            }
            if(leftNode==null || rightNode==null || leftNode.val!=rightNode.val){
                return false;
            }
            que.offerFirst(leftNode.left);
            que.offerFirst(leftNode.right);
            que.offerLast(rightNode.right);
            que.offerLast(rightNode.left);
        }
        return true;
    }
}

递归:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return check(root.left,root.right);
    }
    private boolean check(TreeNode rightNode,TreeNode leftNode){
        if(leftNode==null && rightNode==null){
            return true;
        }
        if((leftNode==null && rightNode!=null)||(leftNode!=null && rightNode==null)||leftNode.val!=rightNode.val){
            return false;
        }
        return check(leftNode.left,rightNode.right)&&check(leftNode.right,rightNode.left);
    }
}

完全二叉树的节点个数 LeetCode 222

题目链接:[LeetCode 222 - 简单]

思路

一种是通用的计算节点个数,另一种是针对于完全二叉树的做法。

递归:

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null)return 0;
        return countNodes(root.left)+countNodes(root.right)+1;
    }
}

仅仅针对于完全二叉树:

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null)return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 0,rightDepth = 0;
        while(left!=null){
            left = left.left;
            leftDepth++;
        }
        while(right!=null){
            right = right.right;
            rightDepth++;
        }
        if(rightDepth==leftDepth){
            return (2<<leftDepth) - 1;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

平衡二叉树 LeetCode 110

题目链接:[LeetCode 110 - 简单]

思路

判断左右子树的高度。

递归:

class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root)!=-1;
    }
    private int getHeight(TreeNode node){
        if(node==null){
            return 0;
        }
        int leftHeight = getHeight(node.left);
        if(leftHeight==-1){
            return -1;
        }
        int rightHeight = getHeight(node.right);
        if(rightHeight==-1){
            return -1;
        }
        if(Math.abs(leftHeight-rightHeight)>1){
            return -1;
        }
        return Math.max(leftHeight,rightHeight)+1;
    }
}