zoukankan      html  css  js  c++  java
  • 前端程序员学好算法系列(八)二叉树和递归

    257. 二叉树的所有路径
    给定一个二叉树,返回所有从根节点到叶子节点的路径。

    说明: 叶子节点是指没有子节点的节点。

    示例:

    输入:
    
    1
    / 
    2 3
    
    5
    
    输出: ["1->2->5", "1->3"]

    解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

    解题:

    1. root == null 直接return
    2. 判断我们的路径是否到达到一个叶子节点中  if(root.left==null && root.right == null){ } 说明我们到达了一个节点 直接res.push(root.val) 然后返回当前值
    3. 我们递归 调用binaryTreePaths(root.left) 返回左子树上满足条件的所有路径 ,遍历获得的路径 res.push(root.val+'->' lefts[i])  这样我们就获得了我们左子树上的所有路径;

    4.同样方法获取右边的所有路径

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {string[]}
     */
    var binaryTreePaths = function(root) {
       let res = []
       if(root ==null){
           return []
       }
       if(root.left==null && root.right == null){
           res.push(String(root.val))
           return res;
       }
       let lefts = binaryTreePaths(root.left)
       for(let i=0;i<lefts.length;i++){
           res.push(String(root.val) + '->' +lefts[i])
       }
       let rights = binaryTreePaths(root.right)
       for(let i=0;i<rights.length;i++){
           res.push(String(root.val) + '->' +rights[i])
       }
       return res
    
    };

    437. 路径总和 III
    给定一个二叉树,它的每个结点都存放着一个整数值。

    找出路径和等于给定数值的路径总数。

    路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

    二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

    示例:

    root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
    
    10
    / 
    5 -3
    /  
    3 2 11
    /  
    3 -2 1
    
    返回 3。和等于 8 的路径有:
    
    1. 5 -> 3
    2. 5 -> 2 -> 1
    3. -3 -> 11

    解题:



    1.我们的主函数每次求解需要求解node node.left和node.right   求解node又需要求解其子函数findPath(sum) 和findPath(sum.left)和findPath(sum.right)
    2.在findPath中由于node.val 存在负值所以我们不能直接求res = 1 需要 res+=1
    3.我们用 findPath(root,sum); 求出从根节点出发所有可能的路径
    4. 我们在分别从 pathSum(root.left,sum)  pathSum(root.right,sum)  从左右节点出发满足条件的路径

    /**
     * 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
     * @param {number} sum
     * @return {number}
     */
    var pathSum = function(root, sum) {
          if(root == null)
            return 0
          let res = findPath(root,sum);
              res += pathSum(root.left,sum);
              res += pathSum(root.right,sum);
              return res
         // 在以node为根节点的二叉树中,寻找包含node的路径,和为sum
         // 返回这个路径的个数
         function findPath(node,num){
             if(node== null){
                 return 0
             }
             let res = 0
             if(node.val ==num){
                 res +=1;
             }
             res += findPath(node.left,num - node.val);
             res += findPath(node.right,num - node.val);
             return res
         }
    };

    235. 二叉搜索树的最近公共祖先
    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

     

    示例 1:

    输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
    输出: 6 
    解释: 节点 2 和节点 8 的最近公共祖先是 6

    解题:
    1.二叉搜索树满足,其任意左节点小于右节点,
    2.当p和q分别在根节点的左边和右边时 根节点及为最近公共祖先
    3.当 root.val>p.val && root.val>q.val  在root的左子树中寻找
    4.当root.val<p.val && root.val<q.val 在root的右

    /**
     * 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==null){
               return root
          }
          if(root.val>p.val && root.val>q.val){
            return lowestCommonAncestor(root.left,p,q)
          }
          if(root.val<p.val && root.val<q.val){
            return lowestCommonAncestor(root.right,p,q)
          }
           
          return root
    
        
        
    };

    二叉树的js内容我们就先介绍到这里

  • 相关阅读:
    CSS3边框与圆角
    测试
    linux 日常高逼格命令统计
    python 获取目录视频时长,大小
    记一次 irqbalance: WARNING, didn't collect load info for all cpus, balancing is broken问题
    loging模块
    修改CentOS7系列网卡名称为传统名称eth0格式
    ELK测试
    linux安装python3-pip3-django的过程
    17.基于scrapy-redis两种形式的分布式爬虫
  • 原文地址:https://www.cnblogs.com/kbnet/p/13387472.html
Copyright © 2011-2022 走看看