HOT100--Day14--543. 二叉树的直径,102. 二叉树的层序遍历,108. 将有序数组转换为二叉搜索树

HOT100–Day14–543. 二叉树的直径,102. 二叉树的层序遍历,108. 将有序数组转换为二叉搜索树

每日刷题系列。今天的题目是《力扣HOT100》题单。

题目类型:二叉树。

关键:要深刻理解《递归》

543. 二叉树的直径

思路:

自底向上遍历。

每个节点告诉上一层,从本节点出发到叶子节点的深度是多少。

每个节点,从左子树最深处走到右子树最深处,就是该节点的左右子树的高度相加,就是当前ans。

每个节点都要更新一次ans。

class Solution {
    private int res;

    public int diameterOfBinaryTree(TreeNode root) {
        dfs(root);
        return res;
    }

    // 自底向上遍历
    private int dfs(TreeNode node) {

        // 对于叶子来说,链长就是 -1+1=0
        if (node == null) {
            return -1;
        }

        // 探左右子树
        int lLen = dfs(node.left) + 1;
        int rLen = dfs(node.right) + 1;

        // 两条链拼成路径。每个节点都要更新最大值(直径)
        res = Math.max(res, lLen + rLen);

        // 把左右子树,长的那一条,返回给上一层
        return Math.max(lLen, rLen);
    }
}

102. 二叉树的层序遍历

思路:

利用队列进行层序遍历。(感觉像是BFS)

当前层的子节点加入队列之后,获取size。

下一层遍历size个节点。

这样就可以实现层序遍历了。

关键点:每层遍历size个。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Deque<TreeNode> que = new ArrayDeque<>();
        que.offer(root);
        while (!que.isEmpty()) {
            List<Integer> list = new ArrayList<>();
            // 关键点:每层遍历size个
            int size = que.size();
            while (size-- > 0) {
                TreeNode cur = que.poll();
                list.add(cur.val);
                if (cur.left != null) {
                    que.offer(cur.left);
                }
                if (cur.right != null) {
                    que.offer(cur.right);
                }
            }
            res.add(list);
        }
        return res;
    }
}

108. 将有序数组转换为二叉搜索树

思路:

要记住,二叉搜索树是跟中序遍历强相关的。

采用分治的思想,递归处理。

对于每一段要处理的数据,找到它的中间点分为左和右。

中间点作为树根,它的左节点,递归到下一层处理[左,中),右节点同理。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return dfs(nums, 0, nums.length);
    }

    // 把 nums[left] 到 nums[right-1] 转成平衡二叉搜索树
    // [left,right)——左闭右开
    private TreeNode dfs(int[] nums, int left, int right) {

        // 指针重合,没有元素了,返回null
        if (left == right) {
            return null;
        }
        // 找到中间指针
        int m = (left + right) >> 1;

        // 中间处作为新节点,递归处理[左,中)和(中,右)   ps:中已经处理了
        return new TreeNode(nums[m], dfs(nums, left, m), dfs(nums, m + 1, right));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值