使用递归注意在回溯时的返回即可,返回值应为:左子树的深度与右子树的深度最大值加上1,因为在到最底下时左右都为空则为1,一步一步回溯即可。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
if(!root)return 0;
return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
};
题目写清了平衡二叉树的定义是每一个结点左右子树深度差均不超过1,因此需要利用两个递归来实现。
定义一个获取当前节点深度的函数(即为上一个题),之后两个变量存储左右子树的深度进行判断取绝对值,大于1则为false,均不大于则为真,return左右结点进行递归。
code:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isBalanced = function(root) {
if (!root) return true;
var h1 = recur(root.left);
var h2 = recur(root.right);
var a = Math.abs(h1-h2);
if (a>1) return false;
return isBalanced(root.left) && isBalanced(root.right);
};
var recur = function(root){
if(!root) return 0;
return Math.max(recur(root.left),recur(root.right))+1;
}
题目要求不能使用关键词和if等判断控制语句
通过递归加&&实现
1+。。+n是需要利用递归的,但是在本地无法写if的回溯条件,可以利用&&来完成回溯,当n的值减少到0的时候,和语句就是false,并且因为逻辑运算符的短路运算,
&&语句如果前面为false,则不会对后面的进行运算。
||语句如果前面为true,则不会对后面的进行运算。
code:
/**
* @param {number} n
* @return {number}
*/
var sumNums = function(n) {
return n && n+sumNums(n-1);
};
根据二叉搜索树的“左小右大”原则,每个结点的左子树必定均小于当前结点,每个结点的右子树必定均大于当前结点。
可以得知在递归时的回溯条件:当当前结点的值均大于p与q的值,则证明其公共祖先应该在左子树,反之则在右子树。而不属于这两种条件的情况为:一个大于当前节点一个小于当前节点,或一个等于另一个大于或者小于,则当前结点为二叉搜索树这两个结点的最近的公共祖先。
code:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode} p
* @param {TreeNode} q
* @return {TreeNode}
*/
var lowestCommonAncestor = function(root, p, q) {
if(root.val > p.val && root.val>q.val) return lowestCommonAncestor(root.left,p,q);
else if(root.val < p.val && root.val<q.val) return lowestCommonAncestor(root.right,p,q);
else return root;
};
该题与上一道题区别在于是普通的二叉树,而上题因为是二叉搜索树,可以利用特性来写递归的条件。
这道题肯定也是需要递归每一个结点的,但是在回溯时的返回条件是难点。
首先定义dfs深度优先搜索函数,先写回溯条件,当root为空时return false;
然后将左子树赋值一个函数的结果,右子树赋值一个函数的结果。
函数的return应为赋值的左函数的结果||右函数的结果||pq任意一个与当前节点的值相等
如果左右结点同时满足,或者左右结点满足一个并且当前值等于pq当中一个的值,则给res赋值结果。最终返回res
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode} p
* @param {TreeNode} q
* @return {TreeNode}
*/
var lowestCommonAncestor = function(root, p, q) {
let res;
const dfs = function(root,p,q){
if (!root) return false;
var l = dfs(root.left,p,q);
var r = dfs(root.right,p,q);
if( (l&&r)||((root.val == p.val || root.val == q.val)&&(l||r)) ){
res = root;
}
return l||r||(root.val == p.val || root.val == q.val);
}
dfs(root,p,q);
return res;
};