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; }

浙公网安备 33010602011771号