代码随想录算法训练营第十五天| 102层序遍历、226.翻转二叉树、101. 对称二叉树

层序遍历

参考文章:代码随想录 

解题思路:

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

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

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

public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        if (root != null) deque.add(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            List<Integer> list = new ArrayList<>();
            while (size-- > 0) {
                TreeNode node = deque.peek();
                deque.poll();
                list.add(node.val);
                if (node.left != null) deque.add(node.left);
                if (node.right != null) deque.add(node.right);
            }
            result.add(list);
        }
        return result;
    }

 226.翻转二叉树

参考文章:代码随想录 

解题思路:

其实就是遍历二叉树,将节点的左右孩子进行呼唤即可,可以使用前序遍历或是后续遍历,注意中序遍历不可行,主要原因是当左孩子完成翻转后,到中结点会进行左右孩子的交换,然后再去完成此时右孩子的翻转时,其实本质上还是翻转的原来的左子树,因此达不到整体翻转的效果。

public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        reverse(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }

    public void reverse(TreeNode root) {
        TreeNode temp;
        temp = root.left;
        root.left = root.right;
        root.right = temp;
    }

 

101. 对称二叉树 

参考文章: 代码随想录

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

解题思路:

通过递归的方法去解决问题,遍历选择后序遍历,因为要得到左右孩子的比较结果,最终传到中间的结点,因此选择这种遍历方式,因为是对称二叉树,因此比较的俩结点在外侧是左孩子的左孩子对比右孩子的右孩子,内侧则是左孩子的右孩子对比右孩子的左孩子,当两个布尔值的与运算结果返回给父节点。

boolean result = true;
        if (root != null) {
            result = compare(root.left, root.right);
        }

        return result;
    }

    public 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 {
            boolean outside = compare(left.left, right.right);
            boolean inside = compare(left.right, right.left);
            return outside && inside;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值