算法打卡第十五天

92 阅读2分钟
  1. 剑指 Offer 34. 二叉树中和为某一值的路径
  2. 剑指 Offer 36. 二叉搜索树与双向链表
  3. 剑指 Offer 54. 二叉搜索树的第k大节点

剑指 Offer 34. 二叉树中和为某一值的路径

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

题意理解: 深度优先+递归 找到从根接到到叶子节点所有路径的和等于目标值的路径

  1. 申明三个变量,一个变量存返回值res,一个变量存当前路径的和sum,一个变量存当前路径上的值current
  2. 当子节点不存在直接return,当为叶子结点并且路径和等于目标值时,保存当前路径
  3. 遍历整棵树,返回res

提示: 树中节点总数在范围 [0, 5000] 内 -1000 <= Node.val <= 1000 -1000 <= targetSum <= 1000

var pathSum = function(root, target) {
    let sum = 0;
    const res = [];
    const current = [];

    function dfs(root) {
        if (!root) return;
        current.push(root.val)
        sum += root.val;
        if (!root.left && !root.right && target === sum) {
            res.push([...current])
        }
        dfs(root.left)
        dfs(root.right)
        current.pop()
        sum -= root.val;
    }
    dfs(root)
    return res;
};

剑指 Offer 36. 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

题意理解: 二叉搜索树又二叉排序树、二叉查找树,是一颗有序树(左节点小于根节点,根节点小于右节点,及按中序遍历排序)

  1. 按中序遍历二叉树,声明两个变量,一个用来存储头指针head,一个用来存储当前节点pre
var treeToDoublyList = function(root) {
    if (root === null) return null;
    let head = null,
        pre = null;

    function dfs(root) {
        if (!root) return;
        dfs(root.left);
        if (pre) {
            pre.right = root;
        } else { // 根节点
            head = root;
        }
        root.left = pre;
        pre = root;
        dfs(root.right)
    }
    dfs(root);
    head.left = pre;
    pre.right = head;
    return head;
};

剑指 Offer 54. 二叉搜索树的第k大节点

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

题意理解 找出二叉树中的k个大节点的值 根据中序遍历左中右进行倒叙就位右中左

  1. 申明变量i用来标记第i个大数,i从0开始,num存储第i个大数的值
  2. 中序遍历倒叙进行,找到第i+1个大数,i++,如果i===k则存储当前大数的值
  3. 返回大数
var kthLargest = function(root, k) {
    if (root === null) return null;
    let i = 0;
    let num = 0;

    function dfs(root) {
        if (!root) return;
        dfs(root.right)
        i++;
        if (i === k) {
            num = root.val
        }
        dfs(root.left);
    }
    dfs(root);
    return num
};