剑指 Offer 34. 二叉树中和为某一值的路径
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
题意理解: 深度优先+递归 找到从根接到到叶子节点所有路径的和等于目标值的路径
- 申明三个变量,一个变量存返回值res,一个变量存当前路径的和sum,一个变量存当前路径上的值current
- 当子节点不存在直接return,当为叶子结点并且路径和等于目标值时,保存当前路径
- 遍历整棵树,返回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. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
题意理解: 二叉搜索树又二叉排序树、二叉查找树,是一颗有序树(左节点小于根节点,根节点小于右节点,及按中序遍历排序)
- 按中序遍历二叉树,声明两个变量,一个用来存储头指针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个大节点的值 根据中序遍历左中右进行倒叙就位右中左
- 申明变量i用来标记第i个大数,i从0开始,num存储第i个大数的值
- 中序遍历倒叙进行,找到第i+1个大数,i++,如果i===k则存储当前大数的值
- 返回大数
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
};