算法训练营打卡Day15 | 二叉树part02

一、层序遍历  10 

代码随想录

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
    public List> levelOrder(TreeNode root) {
        List> result = new ArrayList<>();
        Deque queue = new LinkedList<>();
        if (root != null) {
            queue.add(root);
        }
        
        while (!queue.isEmpty()) {
            int size = queue.size();
            List tmp = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if (node.left != null) {
                    queue.add(node.left);
                } 
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            result.add(tmp);
        }
        return result;    
    }
}

二、LC226.翻转二叉树 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树_哔哩哔哩_bilibiliq

方法一:递归,确定好终止条件。
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return root;
        }

        //交换左右子树
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        //往下递归翻转左右子树
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}
方法二:层序遍历,先将左右子树顺序交换,再把他们的子树加到下一层继续遍历
class Solution {
    public TreeNode invertTree(TreeNode root) {
        Deque queue = new LinkedList<>();
        if (root == null) {
            return root;
        }
        queue.offer(root);
        
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                //层序遍历,先将左右子树顺序交换,再把他们的子树加到下一层继续遍历

                TreeNode node = queue.poll();
                if (node != null) {
                    //1. 左右子树顺序交换
                    TreeNode tmp = node.left;
                    node.left = node.right;
                    node.right = tmp;
                    //2. 将他们的子树加到下一层继续遍历
                    queue.add(node.left);
                    queue.add(node.right);
                }
            }
        }
        return root;
    }
}

三、LC101.对称二叉树 2

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解:新学期要从学习二叉树开始! | LeetCode:101. 对称二叉树_哔哩哔哩_bilibili

对称二叉树,需要比较root左右的二叉树是否对称。有几种节点情况:

1. left 为空,right 不为空,返回 false

2. left 不为空,right 为空,返回 false

3. left 和 right 都为空,返回 true

4. left 和 right 都不为空且 left.val != right.val,返回 false

5. left 和 right 都不为空且 left.val == right.val,继续递归,比较left和right的子树是否对称

注意,在比较的时候,是left的左子树和right的右子树比较,left的右子树和right的左子树比较。

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

        //left.val == right.val,向下遍历
        boolean first = compare(left.left, right.right);
        boolean second = compare(left.right, right.left);
        return first && second;
    }
}

你可能感兴趣的:(算法,数据结构)