Skip to content

Commit 78f8879

Browse files
authored
Merge pull request #161 from gostool/leetcode1104
add: leetcode 1104 solution
2 parents 3755d3f + 28add7d commit 78f8879

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package leetcode
2+
3+
func pathInZigZagTree(label int) []int {
4+
level := getLevel(label)
5+
ans := []int{label}
6+
curIndex := label - (1 << level)
7+
parent := 0
8+
for level >= 1 {
9+
parent, curIndex = getParent(curIndex, level)
10+
ans = append(ans, parent)
11+
level--
12+
}
13+
ans = reverse(ans)
14+
return ans
15+
}
16+
17+
func getLevel(label int) int {
18+
level := 0
19+
nums := 0
20+
for {
21+
nums += 1 << level
22+
if nums >= label {
23+
return level
24+
}
25+
level++
26+
}
27+
}
28+
29+
func getParent(index int, level int) (parent int, parentIndex int) {
30+
parentIndex = 1<<(level-1) - 1 + (index/2)*(-1)
31+
parent = 1<<(level-1) + parentIndex
32+
return
33+
}
34+
35+
func reverse(nums []int) []int {
36+
left, right := 0, len(nums)-1
37+
for left < right {
38+
nums[left], nums[right] = nums[right], nums[left]
39+
left++
40+
right--
41+
}
42+
return nums
43+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question1104 struct {
9+
para1104
10+
ans1104
11+
}
12+
13+
// para 是参数
14+
type para1104 struct {
15+
label int
16+
}
17+
18+
// ans 是答案
19+
type ans1104 struct {
20+
ans []int
21+
}
22+
23+
func Test_Problem1104(t *testing.T) {
24+
25+
qs := []question1104{
26+
27+
{
28+
para1104{14},
29+
ans1104{[]int{1, 3, 4, 14}},
30+
},
31+
32+
{
33+
para1104{26},
34+
ans1104{[]int{1, 2, 6, 10, 26}},
35+
},
36+
}
37+
38+
fmt.Printf("------------------------Leetcode Problem 1104------------------------\n")
39+
40+
for _, q := range qs {
41+
_, p := q.ans1104, q.para1104
42+
fmt.Printf("【input】:%v 【output】:%v \n", p, pathInZigZagTree(p.label))
43+
}
44+
fmt.Printf("\n\n\n")
45+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# [1104. Path In Zigzag Labelled Binary Tree](https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/)
2+
3+
4+
## 题目
5+
6+
In an infinite binary tree where every node has two children, the nodes are labelled in row order.
7+
8+
In the odd numbered rows (ie., the first, third, fifth,...), the labelling is left to right, while in the even numbered rows (second, fourth, sixth,...), the labelling is right to left.
9+
10+
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/06/28/tree.png)
11+
12+
Given the label of a node in this tree, return the labels in the path from the root of the tree to the node with that label.
13+
14+
15+
**Example 1:**
16+
17+
Input: label = 14
18+
Output: [1,3,4,14]
19+
20+
**Example 2:**
21+
22+
Input: label = 26
23+
Output: [1,2,6,10,26]
24+
25+
**Constraints:**
26+
27+
1. `1 <= label <= 10^6`
28+
29+
## 题目大意
30+
31+
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
32+
33+
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
34+
35+
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
36+
37+
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/06/28/tree.png)
38+
39+
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。
40+
41+
42+
43+
## 解题思路
44+
45+
- 计算出label所在的level和index
46+
- 根据index和level计算出父节点的index和value
47+
- level减一,循环计算出对应的父节点直到根节点

0 commit comments

Comments
 (0)