Skip to content

Commit 08ced54

Browse files
committed
feat: add python and java solutions to lcof question
添加《剑指 Offer》题解:面试题54. 二叉搜索树的第k大节点
1 parent 3471e18 commit 08ced54

File tree

4 files changed

+158
-1
lines changed

4 files changed

+158
-1
lines changed

lcof/面试题19. 正则表达式匹配/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ p = "mis*is*p*."
6161

6262
现在如果已知了 `dp[i-1][j-1]` 的状态,我们该如何确定 `dp[i][j]` 的状态呢?我们可以分三种情况讨论,其中,前两种情况考虑了所有能匹配的情况,剩下的就是不能匹配的情况了:
6363

64-
1. `s[i] == p[j]` or `p[j] == '.'`:比如 ab**b** 和 ab**b**,或者 ab**b** 和 ab**\.** ,很容易得到 `dp[i][j]` = `dp[i-1][j-1]` = True。因为 ab 和 ab 是匹配的,如果后面分别加一个 b,或者 s 加一个 b 而 p 加一个 `.` ,仍然是匹配的。
64+
1. `s[i] == p[j]` or `p[j] == '.'`:比如 ab**b** 和 ab**b**,或者 ab**b** 和 ab. ,很容易得到 `dp[i][j]` = `dp[i-1][j-1]` = True。因为 ab 和 ab 是匹配的,如果后面分别加一个 b,或者 s 加一个 b 而 p 加一个 `.` ,仍然是匹配的。
6565

6666
2. `p[j] == '*'`:当 `p[j] == '*'` 时,由于 `*` 与前面的字符相关,因此我们比较 `*` 前面的字符 `p[j-1]``s[i]` 的关系。根据 `*` 前面的字符与 s[i] 是否相等,又可分为以下两种情况:
6767

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# [面试题54. 二叉搜索树的第k大节点](https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/)
2+
3+
## 题目描述
4+
给定一棵二叉搜索树,请找出其中第k大的节点。
5+
6+
**示例 1:**
7+
8+
```
9+
输入: root = [3,1,4,null,2], k = 1
10+
3
11+
/ \
12+
1 4
13+
\
14+
  2
15+
输出: 4
16+
```
17+
18+
**示例 2:**
19+
20+
```
21+
输入: root = [5,3,6,2,4,null,null,1], k = 3
22+
5
23+
/ \
24+
3 6
25+
/ \
26+
2 4
27+
/
28+
1
29+
输出: 4
30+
```
31+
32+
**限制:**
33+
34+
- `1 ≤ k ≤ 二叉搜索树元素个数`
35+
36+
## 解法
37+
先遍历右子树,访问根节点,再遍历左子树。遍历到第 k 个结点时,存储结果。
38+
39+
40+
### Python3
41+
```python
42+
# Definition for a binary tree node.
43+
# class TreeNode:
44+
# def __init__(self, x):
45+
# self.val = x
46+
# self.left = None
47+
# self.right = None
48+
49+
class Solution:
50+
t, res = 0, -1
51+
def kthLargest(self, root: TreeNode, k: int) -> int:
52+
self.t = k
53+
self._traverse(root)
54+
return self.res
55+
56+
def _traverse(self, node):
57+
if node:
58+
self._traverse(node.right)
59+
self.t -= 1
60+
if self.t == 0:
61+
self.res = node.val
62+
return
63+
self._traverse(node.left)
64+
```
65+
66+
### Java
67+
```java
68+
/**
69+
* Definition for a binary tree node.
70+
* public class TreeNode {
71+
* int val;
72+
* TreeNode left;
73+
* TreeNode right;
74+
* TreeNode(int x) { val = x; }
75+
* }
76+
*/
77+
class Solution {
78+
private int t;
79+
private int res;
80+
public int kthLargest(TreeNode root, int k) {
81+
t = k;
82+
traverse(root);
83+
return res;
84+
}
85+
86+
private void traverse(TreeNode node) {
87+
if (node != null) {
88+
traverse(node.right);
89+
--t;
90+
if (t == 0) {
91+
res = node.val;
92+
return;
93+
}
94+
traverse(node.left);
95+
}
96+
}
97+
}
98+
```
99+
100+
### ...
101+
```
102+
103+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
class Solution {
11+
private int t;
12+
private int res;
13+
public int kthLargest(TreeNode root, int k) {
14+
t = k;
15+
traverse(root);
16+
return res;
17+
}
18+
19+
private void traverse(TreeNode node) {
20+
if (node != null) {
21+
traverse(node.right);
22+
--t;
23+
if (t == 0) {
24+
res = node.val;
25+
return;
26+
}
27+
traverse(node.left);
28+
}
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
9+
class Solution:
10+
t, res = 0, -1
11+
12+
def kthLargest(self, root: TreeNode, k: int) -> int:
13+
self.t = k
14+
self._traverse(root)
15+
return self.res
16+
17+
def _traverse(self, node):
18+
if node:
19+
self._traverse(node.right)
20+
self.t -= 1
21+
if self.t == 0:
22+
self.res = node.val
23+
return
24+
self._traverse(node.left)

0 commit comments

Comments
 (0)