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

递归三部曲:

1.确定递归函数的参数和返回值

2.确定终止条件

3.确定单层递归的逻辑

102.层序遍历

🔗题目链接:力扣

💡解题思路:

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

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

代码如下:

class Solution {
    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun(root);
        return resList;
    }

    //BFS——迭代方式——借助队列
    public void checkFun(TreeNode node) {
        if(node == null) return;
        Queue<TreeNode> que = new LinkedList<TreeNode>();
        que.offer(node);

        while (!que.isEmpty()) {
            List<Integer> itemList = new ArrayList<Integer>();
            int len = que.size();

            while (len > 0) {
                TreeNode tmpNode = que.poll();
                itemList.add(tmpNode.val);

                if(tmpNode.left != null) que.offer(tmpNode.left);
                if(tmpNode.right != null) que.offer(tmpNode.right);
                len--;
            }
            resList.add(itemList);
        }
    }
}

102二叉树的层序遍历

学会二叉树的层序遍历,可以一口气打完以下十题

226.翻转二叉树

🔗题目链接:力扣

💡解题思路:递归

采用前序或后序遍历的方式交换左右节点

代码如下:

public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        invertTree(root.left);
        invertTree(root.right);
        swapNode(root);
        return root;
    }
    private void swapNode (TreeNode root) {
        TreeNode tmp = null;
        tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }

 101.对称二叉树

🔗题目链接:力扣

💡解题思路:递归

比较的是两个子树的里侧和外侧的元素是否相等。

正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

但都可以理解算是后序遍历,尽管已经不是严格上在一个树上进行遍历的后序遍历了。

代码如下:

public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    private boolean compare(TreeNode left, TreeNode right) {
        if(left == null && right == null) return true;
        else if(left == null && right != null) return false;
        else if(left != null && right == null) return false;
        else if(left.val != right.val) return false;

        boolean inside = compare(left.right, right.left );
        boolean outside = compare(left.left, right.right);
        return inside && outside;
    }
📝今日心得

人工走了一遍层序遍历,十道题虽然简单,但还是做了很久。递归依旧是我的痛,看答案能理解,自己就想不出来。

🤩 让刷题成为习惯。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值