Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b561507

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /