遍历
前序遍历
function preOrderTraverse(node) {
if(!node) return
console.log(node.value)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
}
preOrderTraverse(r) // root, left, right: 前序遍历root在前面
中序遍历
function inOrderTraverse(node) {
if(!node) return
inOrderTraverse(node.left)
console.log(node.value)
inOrderTraverse(node.right)
}
inOrderTraverse(r) // left, root, right: 中序遍历root在中间
后序遍历
function postOrderTraverse(node) {
if(!node) return
postOrderTraverse(node.left)
postOrderTraverse(node.right)
console.log(node.value)
}
postOrderTraverse(r) // left, right, root: 后序遍历root在后边
二叉搜索树
结构特点
- left <= node
- right >= node
求第k小值
- 二叉搜索树的结构特点: letf < node < right
- 使用中序遍历,
- 顺序刚好为 nums = [2, 3, 4, 5, 6, 7, 8]
- 刚好是一个递增数组
- 第k小值为 nums[k-1]
- leetCode
type TreeNode = {
val: number;
left: TreeNode | null;
right: TreeNode | null;
};
function getNums(root: TreeNode | null) {
const nums: number[] = [];
inOrderTraverse(root);
return nums;
function inOrderTraverse(node: TreeNode | null) {
if (!node) return;
inOrderTraverse(node.left);
nums.push(node.val);
inOrderTraverse(node.right);
}
}
function kthSmallest(root: TreeNode | null, k: number): number {
const nums = getNums(root);
return nums[k - 1];
}
最小堆
结构特点:
父节点永远小于子节点
结构关系
// 为了节约内存空间, 我们一般用数组来存放二叉树
const nums = [-1, 10, 14, 25, 33, 81, 82, 99]
// 如何查询:
// 例如: 14 的index是 2, parent是10, left是33, right是81
const parentIndex = Math.floor(i/2)
const leftIndex = 2*i
const rightIndex = 2*i+1