Skip to content

Commit b561507

Browse files
committed
feat: update 5 leetcode about binary tree
1 parent 84b6580 commit b561507

5 files changed

+276
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* @lc app=leetcode id=222 lang=typescript
3+
*
4+
* [222] Count Complete Tree Nodes
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* class TreeNode {
11+
* val: number
12+
* left: TreeNode | null
13+
* right: TreeNode | null
14+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
15+
* this.val = (val===undefined ? 0 : val)
16+
* this.left = (left===undefined ? null : left)
17+
* this.right = (right===undefined ? null : right)
18+
* }
19+
* }
20+
*/
21+
22+
/**
23+
* @description: 这里其实对常规二叉树也有效
24+
* @param {TreeNode} root
25+
* @return {number}
26+
*/
27+
function countNodes(root: TreeNode | null): number {
28+
if (root === null) return 0;
29+
const left = countNodes(root.left);
30+
const right = countNodes(root.right);
31+
32+
return left + right + 1;
33+
};
34+
// @lc code=end
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* @lc app=leetcode id=230 lang=typescript
3+
*
4+
* [230] Kth Smallest Element in a BST
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* class TreeNode {
11+
* val: number
12+
* left: TreeNode | null
13+
* right: TreeNode | null
14+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
15+
* this.val = (val===undefined ? 0 : val)
16+
* this.left = (left===undefined ? null : left)
17+
* this.right = (right===undefined ? null : right)
18+
* }
19+
* }
20+
*/
21+
22+
/**
23+
* @description: 中序遍历,迭代的方式
24+
* 时间复杂度 O(H+k)
25+
* 空间复杂度 O(H)
26+
* H 是树的高度
27+
* @param {TreeNode} root
28+
* @param {number} k
29+
* @return {number}
30+
*/
31+
function kthSmallest(root: TreeNode | null, k: number): number {
32+
if (root === null) return null;
33+
34+
let stack = [root];
35+
let node = root;
36+
while (stack.length || node !== null) {
37+
while (node !== null) {
38+
stack.push(node);
39+
node = node.left;
40+
}
41+
const cur = stack.pop();
42+
k--;
43+
if (k === 0) {
44+
return cur.val;
45+
}
46+
if (cur.right !== null) {
47+
node = cur.right;
48+
}
49+
}
50+
}
51+
52+
/**
53+
* @description: 二叉搜索树中序遍历后输出的值是有序的,利用这一特性
54+
* 时间复杂度 O(n): 全部遍历一遍
55+
* 空间复杂度 O(n)? 不确定
56+
* @param {TreeNode} root
57+
* @param {number} k
58+
* @return {number}
59+
*/
60+
function kthSmallestByRecursion(root: TreeNode | null, k: number): number {
61+
let res: number[] = [];
62+
63+
/**
64+
* @description: 中序遍历,递归实现
65+
* @param {TreeNode|null} node
66+
* @return {void}
67+
*/
68+
function inOrderWalker(node: TreeNode | null) {
69+
if (node === null) return null;
70+
71+
inOrderWalker(node.left);
72+
node.val !== null && res.push(node.val);
73+
inOrderWalker(node.right);
74+
}
75+
inOrderWalker(root);
76+
77+
return res[k - 1];
78+
};
79+
// @lc code=end

leetcode/268.missing-number.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* @lc app=leetcode id=268 lang=typescript
3+
*
4+
* [268] Missing Number
5+
*/
6+
// @lc code=start
7+
/**
8+
* @description: 位运算的思路
9+
* 使用异或
10+
* 时间复杂度 O(2n+1)
11+
* 空间复杂度 O(1)
12+
* @param {number} nums
13+
* @return {number}
14+
*/
15+
function missingNumber(nums:number[]): number {
16+
const n = nums.length;
17+
let xor = 0;
18+
19+
for (let i = 0; i < n; i++) {
20+
xor ^= nums[i]
21+
}
22+
// 注意这里的条件是小于等于,需要计算 n 的情况
23+
for (let i = 0; i <= n; i++) {
24+
xor ^= i;
25+
}
26+
27+
return xor;
28+
}
29+
30+
/**
31+
* @description: 哈希表的思路
32+
* 空间换时间
33+
* 时间复杂度 O(2n)
34+
* 空间复杂度 O(n)
35+
* @param {number} nums
36+
* @return {number}
37+
*/
38+
function missingNumber2(nums:number[]): number {
39+
const arr: number[] = [];
40+
const n = nums.length;
41+
42+
for (let i = 0; i < n; i++) {
43+
// 使用另一个散列表数组来保存所有索引值
44+
arr[nums[i]] = nums[i];
45+
}
46+
47+
for (let i = 0; i < n; i++) {
48+
// 如果没有,说明缺少这个数字
49+
if (arr[i] === undefined) return i;
50+
}
51+
52+
return n;
53+
}
54+
55+
// 时间复杂度应该是 O(n^2)
56+
// 每次查询会耗费非常多的时间
57+
function missingNumber3(nums: number[]): number {
58+
if (nums.length === 1) return nums[0] === 0 ? 1 : 0;
59+
60+
const n = nums.length;
61+
// 直接使用连续索引来判断
62+
for (let i = 0; i < n; i++) {
63+
if (!nums.includes(i)) return i;
64+
}
65+
66+
return n;
67+
};
68+
69+
function missingNumber4(nums: number[]): number {
70+
if (nums.length === 1) return nums[0] === 0 ? 1 : 0;
71+
72+
const n = nums.length;
73+
nums.sort((a, b) => a - b);
74+
75+
// 利用排序后,每一位和对应的索引相等的特点
76+
for (let i = 0; i < n; i++) {
77+
if (nums[i] !== i) return i;
78+
}
79+
80+
return n;
81+
};
82+
83+
function missingNumber5(nums: number[]): number {
84+
if (nums.length === 1) return nums[0] === 0 ? 1 : 0;
85+
86+
const n = nums.length;
87+
nums.sort((a, b) => a - b);
88+
// 利用排序后,后一位和前一位默认相差是 1 的特点来查询
89+
for (let i = 1; i < n; i++) {
90+
if (nums[i] !== nums[i - 1] + 1) return nums[i] - 1;
91+
}
92+
93+
return nums[0] === 0 ? n : 0;
94+
};
95+
// @lc code=end
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* class TreeNode {
4+
* val: number
5+
* left: TreeNode | null
6+
* right: TreeNode | null
7+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.left = (left===undefined ? null : left)
10+
* this.right = (right===undefined ? null : right)
11+
* }
12+
* }
13+
*/
14+
15+
/**
16+
* @description: 循环的方式,不是递归的方式
17+
* 时间复杂度 O(n)
18+
* 空间复杂度 O(1)
19+
* @param {TreeNode} root
20+
* @param {number} val
21+
* @return {TreeNode}
22+
*/
23+
function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null {
24+
if (root === null) return new TreeNode(val);
25+
let node = root;
26+
27+
// 循环到尽头位置
28+
while (node !== null) {
29+
// 如果节点值比传入值小,就从右边开始找
30+
if (node.val < val) {
31+
if (node.right === null) {
32+
node.right = new TreeNode(val);
33+
break;
34+
}
35+
node = node.right;
36+
} else {
37+
if (node.left === null) {
38+
node.left = new TreeNode(val);
39+
break;
40+
}
41+
node = node.left;
42+
}
43+
}
44+
45+
return root;
46+
};
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* @lc app=leetcode id=96 lang=typescript
3+
*
4+
* [96] Unique Binary Search Trees
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* @description: 数学公式的方式,卡特兰数
10+
* @param {number} n
11+
* @return {number}
12+
*/
13+
function numTrees(n: number): number {
14+
let C: number = 1;
15+
16+
for (let i = 0; i < n; i++) {
17+
C *= 2 * (2 * i + 1) / (i + 2);
18+
}
19+
20+
return C;
21+
};
22+
// @lc code=end

0 commit comments

Comments
 (0)