算法打卡第十八天

109 阅读1分钟
  1. 剑指 Offer 55 - I. 二叉树的深度
  2. 剑指 Offer 55 - II. 平衡二叉树

剑指 Offer 55 - I. 二叉树的深度

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

题意理解: 深度优先 中序遍历

  1. 声明变量一个用来存储当前层数,一个用来存储当前最大层数
  2. 递归二叉树,符合条件深度+1,为子节点深度-1;
  3. 比较当前层数和当前最大层数
  4. 返回最大层数

提示: 节点总数 <= 10000

var maxDepth = function (root) {
    if (!root) return 0;
    let max = 1;
    let current = 1;
    function deep(root) {
        if (!root) return;
        current++;
        deep(root.left)
        deep(root.right)
        current--;
        max = Math.max(current, max)
    }
    deep(root)
    return max;
};

剑指 Offer 55 - II. 平衡二叉树

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

题意理解: 平衡二叉树:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树

  1. 深度优先,先序遍历
  2. 节点不存在返回true
  3. 递归遍历,不符合条件设为-1,直接返回
  4. 递归左右子树,判断各个节点是否否和条件

限制: 0 <= 树的结点个数 <= 10000

var isBalanced = function(root) {
    if (!root) return true;
    function height(root) {
        if (!root) {
            return 0;
        }
        let leftHeight = height(root.left);
        let rightHeight = height(root.right);
        if (leftHeight === -1 || rightHeight === -1 || Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        } else {
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
    return height(root)>=0
};