深度优先搜索进阶(DFS二叉树的深度问题,最近祖先问题)

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

使用递归注意在回溯时的返回即可,返回值应为:左子树的深度与右子树的深度最大值加上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;
};

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

题目写清了平衡二叉树的定义是每一个结点左右子树深度差均不超过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;
}

剑指 Offer 64. 求1+2+…+n

题目要求不能使用关键词和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);
};

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

根据二叉搜索树的“左小右大”原则,每个结点的左子树必定均小于当前结点,每个结点的右子树必定均大于当前结点。

可以得知在递归时的回溯条件:当当前结点的值均大于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;
};

剑指 Offer 68 - II. 二叉树的最近公共祖先

该题与上一道题区别在于是普通的二叉树,而上题因为是二叉搜索树,可以利用特性来写递归的条件。

这道题肯定也是需要递归每一个结点的,但是在回溯时的返回条件是难点。

首先定义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;
    
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值