110_平衡二叉树(递归算法)

一、基本概念

在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递 和 归,这正是递归思想的精华所在。

二、基本思想与概念

递归就是有去和有回。有去是指:递归问题必须可以分解为若干个规模较小、与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决;有回是指:这些问题的演化过程是一个从大到小、由近及远的过程,并且会有一个明确的终点,一旦到达了这个临界点,就不能再往更小、更远的地方走下去。最后从这个临界点开始,原路返回到原点,原问题解决。

三、使用场景

1). 问题的定义是按递归定义的(Fibonacci函数,阶乘,…);

2). 问题的解法是递归的(有些问题只能使用递归方法来解决,例如,汉诺塔问题,…);

3). 数据结构是递归的(链表、树等的操作,包括树的遍历,树的深度,…)。

四、求解步骤

1、明确递归终止条件;

2、给出递归终止时的处理办法;

3、提取重复的逻辑,缩小问题规模。

五、递归算法-平衡二叉树

1.题目分析

概念:二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。

   二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0。

返回值要返回传入节点为根节点树的深度。所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。

分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了。

2.代码编写

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function (root) {
    const getDepth = function (node) {
        if (node == null) {
            return 0;
        }
        let leftDepth = getDepth(node.left);
        if (leftDepth == -1) {
            return -1;
        }

        let rightDepth = getDepth(node.right);
        if (rightDepth == -1) {
            return -1;
        }

        if (Math.abs(leftDepth - rightDepth) > 1) {
            return -1;
        } else {
            return 1 + Math.max(leftDepth, rightDepth);
        }
    }
    return getDepth(root) == -1 ? false : true;
}

 

posted @ 2021-09-14 20:00  jailbreakaaaa  阅读(118)  评论(0)    收藏  举报