Skip to content

Commit 1d83eac

Browse files
committed
feat: add solutions to lc problem: No.1104
No.1104.Path In Zigzag Labelled Binary Tree
1 parent 44a008d commit 1d83eac

File tree

6 files changed

+202
-12
lines changed

6 files changed

+202
-12
lines changed

solution/1100-1199/1104.Path In Zigzag Labelled Binary Tree/README.md

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,98 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
**方法一:数学**
46+
47+
对于一棵完全二叉树,第 $i$ 行的节点个数为 $2^{i-1}$,第 $i$ 行的节点编号范围为 $[2^{i-1}, 2^i - 1]$。而题目中对于奇数行,按从左到右的顺序进行标记,对于偶数行,按从右到左的顺序进行标记。所以对于第 $i$ 行的节点 $label$,它的互补节点编号为 $2^{i-1} + 2^i - 1 - label$。所以节点 $label$ 的实际父节点编号为 $(2^{i-1} + 2^i - 1 - label) / 2$。我们可以通过不断地求互补节点编号和父节点编号,直到到达根节点,即可得到从根节点到节点 $label$ 的路径。
48+
49+
最后,我们需要将路径反转,因为题目要求路径是从根节点到节点 $label$ 的路径。
50+
51+
时间复杂度 $O(\log n)$,其中 $n$ 为节点 $label$ 的编号。忽略答案的空间消耗,空间复杂度 $O(1)$。
52+
4553
<!-- tabs:start -->
4654

4755
### **Python3**
4856

4957
<!-- 这里可写当前语言的特殊实现逻辑 -->
5058

5159
```python
52-
60+
class Solution:
61+
def pathInZigZagTree(self, label: int) -> List[int]:
62+
x = i = 1
63+
while (x << 1) <= label:
64+
x <<= 1
65+
i += 1
66+
ans = [0] * i
67+
while i:
68+
ans[i - 1] = label
69+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1
70+
i -= 1
71+
return ans
5372
```
5473

5574
### **Java**
5675

5776
<!-- 这里可写当前语言的特殊实现逻辑 -->
5877

5978
```java
79+
class Solution {
80+
public List<Integer> pathInZigZagTree(int label) {
81+
int x = 1, i = 1;
82+
while ((x << 1) <= label) {
83+
x <<= 1;
84+
++i;
85+
}
86+
List<Integer> ans = new ArrayList<>();
87+
for (; i > 0; --i) {
88+
ans.add(label);
89+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1;
90+
}
91+
Collections.reverse(ans);
92+
return ans;
93+
}
94+
}
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
vector<int> pathInZigZagTree(int label) {
103+
int x = 1, i = 1;
104+
while ((x << 1) <= label) {
105+
x <<= 1;
106+
++i;
107+
}
108+
vector<int> ans;
109+
for (; i > 0; --i) {
110+
ans.push_back(label);
111+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1;
112+
}
113+
reverse(ans.begin(), ans.end());
114+
return ans;
115+
}
116+
};
117+
```
60118
119+
### **Go**
120+
121+
```go
122+
func pathInZigZagTree(label int) (ans []int) {
123+
x, i := 1, 1
124+
for x<<1 <= label {
125+
x <<= 1
126+
i++
127+
}
128+
for ; i > 0; i-- {
129+
ans = append(ans, label)
130+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1
131+
}
132+
for i, j := 0, len(ans)-1; i < j; i, j = i+1, j-1 {
133+
ans[i], ans[j] = ans[j], ans[i]
134+
}
135+
return
136+
}
61137
```
62138

63139
### **...**

solution/1100-1199/1104.Path In Zigzag Labelled Binary Tree/README_EN.md

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,81 @@
4141
### **Python3**
4242

4343
```python
44-
44+
class Solution:
45+
def pathInZigZagTree(self, label: int) -> List[int]:
46+
x = i = 1
47+
while (x << 1) <= label:
48+
x <<= 1
49+
i += 1
50+
ans = [0] * i
51+
while i:
52+
ans[i - 1] = label
53+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1
54+
i -= 1
55+
return ans
4556
```
4657

4758
### **Java**
4859

4960
```java
61+
class Solution {
62+
public List<Integer> pathInZigZagTree(int label) {
63+
int x = 1, i = 1;
64+
while ((x << 1) <= label) {
65+
x <<= 1;
66+
++i;
67+
}
68+
List<Integer> ans = new ArrayList<>();
69+
for (; i > 0; --i) {
70+
ans.add(label);
71+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1;
72+
}
73+
Collections.reverse(ans);
74+
return ans;
75+
}
76+
}
77+
```
78+
79+
### **C++**
80+
81+
```cpp
82+
class Solution {
83+
public:
84+
vector<int> pathInZigZagTree(int label) {
85+
int x = 1, i = 1;
86+
while ((x << 1) <= label) {
87+
x <<= 1;
88+
++i;
89+
}
90+
vector<int> ans;
91+
for (; i > 0; --i) {
92+
ans.push_back(label);
93+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1;
94+
}
95+
reverse(ans.begin(), ans.end());
96+
return ans;
97+
}
98+
};
99+
```
50100
101+
### **Go**
102+
103+
```go
104+
func pathInZigZagTree(label int) (ans []int) {
105+
x, i := 1, 1
106+
for x<<1 <= label {
107+
x <<= 1
108+
i++
109+
}
110+
for ; i > 0; i-- {
111+
ans = append(ans, label)
112+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1
113+
}
114+
for i, j := 0, len(ans)-1; i < j; i, j = i+1, j-1 {
115+
ans[i], ans[j] = ans[j], ans[i]
116+
}
117+
return
118+
}
51119
```
52120

53121
### **...**
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> pathInZigZagTree(int label) {
4+
int x = 1, i = 1;
5+
while ((x << 1) <= label) {
6+
x <<= 1;
7+
++i;
8+
}
9+
vector<int> ans;
10+
for (; i > 0; --i) {
11+
ans.push_back(label);
12+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1;
13+
}
14+
reverse(ans.begin(), ans.end());
15+
return ans;
16+
}
17+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
func pathInZigZagTree(label int) (ans []int) {
2+
x, i := 1, 1
3+
for x<<1 <= label {
4+
x <<= 1
5+
i++
6+
}
7+
for ; i > 0; i-- {
8+
ans = append(ans, label)
9+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1
10+
}
11+
for i, j := 0, len(ans)-1; i < j; i, j = i+1, j-1 {
12+
ans[i], ans[j] = ans[j], ans[i]
13+
}
14+
return
15+
}
Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
class Solution {
22
public List<Integer> pathInZigZagTree(int label) {
3-
List<Integer> res = new ArrayList<>();
4-
int n = Integer.highestOneBit(label);
5-
while (label > 0) {
6-
res.add(label);
7-
int pos = ((n << 1) - 1 - label) >> 1;
8-
label = (n >> 1) + pos;
9-
n >>= 1;
3+
int x = 1, i = 1;
4+
while ((x << 1) <= label) {
5+
x <<= 1;
6+
++i;
107
}
11-
Collections.reverse(res);
12-
return res;
8+
List<Integer> ans = new ArrayList<>();
9+
for (; i > 0; --i) {
10+
ans.add(label);
11+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1;
12+
}
13+
Collections.reverse(ans);
14+
return ans;
1315
}
14-
}
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def pathInZigZagTree(self, label: int) -> List[int]:
3+
x = i = 1
4+
while (x << 1) <= label:
5+
x <<= 1
6+
i += 1
7+
ans = [0] * i
8+
while i:
9+
ans[i - 1] = label
10+
label = ((1 << (i - 1)) + (1 << i) - 1 - label) >> 1
11+
i -= 1
12+
return ans

0 commit comments

Comments
 (0)