为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第14天 数据结构之“树”

标签:
JavaScript

课程名称:JavaScript版数据结构与算法
课程章节:第8章 数据结构之“树”
主讲老师:lewis

课程内容:

今天学习的内容包括:
8-7 LeetCode:102. 二叉树的层序遍历——通过广度优先遍历,记录同一层级节点并返回。
8-8 LeetCode:94. 二叉树的中序遍历——中序遍历为左根右,把对应遍历记录返回。
8-9 LeetCode:112. 路径总和——通过深度度优先遍历计算每条路径值的和是否满足targetSum。

课程收获:

二叉树的层序遍历

1、基于广度优先遍历实现二叉树的层序遍历
2、本题使用了三种解法

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if(!root) return []
    // -------------------1------------------
    // let res = []
    // let btf = (p,l) => {
    //     if(res[l]){
    //         res[l].push(p.val)
    //     }else{
    //         res.push([p.val])
    //     }
    //     if(p.left) btf(p.left,l+1)
    //     if(p.right) btf(p.right,l+1)
    // }
    // btf(root,0)
    // -------------------1------------------
    // -------------------2------------------
    // let res = []
    // let p = [[root,0]]
    // while(p.length){
    //     let [n,l] = p.shift()
    //     if(res[l]){
    //         res[l].push(n.val)
    //     }else{
    //         res.push([n.val])
    //     }
    //     if(n.left) p.push([n.left,l+1])
    //     if(n.right) p.push([n.right,l+1])
    // }
    // -------------------2------------------
    // -------------------3------------------
    let res = []
    let p = [root]
    while(p.length){
        let len = p.length
        res.push([])
        while(len--) {
            let n = p.shift()
            res[res.length - 1].push(n.val)
            if(n.left) p.push(n.left)
            if(n.right) p.push(n.right)
        }
    }
    // -------------------3------------------
    return res
};

二叉树的中序遍历

1、中序遍历的特点为左中右遍历模式
2、将遍历以数据返回
3、本题使用两种解题方法

/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    // let res = []
    // const rec = (n) => {
    //     if(!n) return
    //     rec(n.left)
    //     res.push(n.val)
    //     rec(n.right)
    // }
    // rec(root)
    let res = []
    let stack = []
    let p = root
    while(stack.length || p){
        while(p){
            stack.push(p)
            p = p.left
        }
        const n = stack.pop()
        res.push(n.val)
        p = n.right
    }
    return res
};

路径总和

1、通过深度度优先遍历计算每条路径值的和是否满足targetSum
2、如果满足返回true否则返回false
3、本题采用两种解题方法

/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
var hasPathSum = function(root, targetSum) {
  if(!root) return false
  // let stack = [[root, 0]]
  // while(stack.length){
  //   let [p,l] = stack.shift()
  //   if(!p.left && !p.right && l+p.val === targetSum) return true
  //   if(p.left) stack.push([p.left, l+p.val])
  //   if(p.right) stack.push([p.right, l+p.val])
  // }
  // return false
  let res = false
  const dfs = (p,l) => {
    if(!p.left && !p.right && l+p.val === targetSum) res = true
    if(p.left) dfs(p.left, l+p.val)
    if(p.right) dfs(p.right, l+p.val)
  }
  dfs(root, 0)
  return res
};

今天学习的这三道算法题,都是先自己思考然后尝试着写,自己也写出来了一点东西,再结合老师所讲的内容,感觉收获还是很大的,感觉自己还是能够学得会,写得出,能思考,能解决问题的,对自己说一句,加油😀~

坚持打卡,坚持学习!明天见💪~

​​​​
https://img3.sycdn.imooc.com/62fcaf470001fe2b22861226.jpg

https://img1.sycdn.imooc.com//62fcee480001c44919200892.jpg

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消