Skip to content

Commit 6857fdf

Browse files
committed
doc: 每日一题增加JSONP的题目
1 parent e4bb039 commit 6857fdf

11 files changed

+1457
-142
lines changed
Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
### 从上到下打印二叉树
2+
3+
例如有棵树是这样的:
4+
5+
```
6+
1
7+
/ \
8+
2 3
9+
/ \ / \
10+
4 6 7 5
11+
```
12+
13+
该课树转换为JS代码:
14+
15+
```javascript
16+
class Node {
17+
constructor (value, left = null, right = null) {
18+
this.value = value;
19+
this.left = left;
20+
this.right = right;
21+
}
22+
}
23+
const tree = new Node(1, new Node(2, new Node(4), new Node(6)), new Node(3, new Node(7), new Node(5)));
24+
```
25+
26+
(为后面三题的前置条件)
27+
28+
29+
30+
## 题目1-不分行从上到下打印
31+
32+
### 题目描述
33+
34+
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
35+
36+
需要输出:
37+
38+
```javascript
39+
[1, 2, 3, 4, 6, 7, 5]
40+
```
41+
42+
43+
44+
### 解题思路
45+
46+
这道题其实很简单啦,看这输出结果,不就是求二叉树的广度遍历吗?
47+
48+
### coding
49+
50+
OK👌,直接开搞:
51+
52+
```javascript
53+
function print(node) {
54+
let list = [];
55+
let stack = [node];
56+
while (stack.length !== 0) {
57+
node = stack.shift();
58+
list.push(node.value);
59+
if (node.left) stack.push(node.left);
60+
if (node.right) stack.push(node.right);
61+
}
62+
return list;
63+
}
64+
console.log(print(tree));
65+
```
66+
67+
68+
69+
## 题目2-把二叉树打印成多行
70+
71+
### 题目描述
72+
73+
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
74+
75+
需要输出:
76+
77+
```javascript
78+
[
79+
[1],
80+
[2, 3],
81+
[4, 6, 7, 5]
82+
]
83+
```
84+
85+
86+
87+
### 解题思路
88+
89+
- 总体来说还是需要使用广度遍历
90+
- 需要定义一个二维数组`result`来盛放每一层的结果,也就是最后的输出结果
91+
- 需要一个数组`tempArr`来盛放当前这层所有节点的值
92+
- 需要一个变量来记录当前这层的节点数量`currentNums`
93+
- 需要一个变量来记录当前这层的孩子节点的数量`childNums`
94+
- 当前层遍历完成后开始遍历孩子节点,`currentNums`赋值为`childNums``childNums`赋值为`0`
95+
96+
97+
98+
### coding
99+
100+
```javascript
101+
function print (node) {
102+
let result = [];
103+
let tempArr = [];
104+
let currentNums = 1;
105+
let childNums = 0;
106+
let stack = [node];
107+
while (stack.length !== 0) {
108+
node = stack.shift();
109+
tempArr.push(node.value);
110+
if (node.left) {
111+
stack.push(node.left);
112+
childNums++;
113+
}
114+
if (node.right) {
115+
stack.push(node.right);
116+
childNums++;
117+
}
118+
currentNums--;
119+
if (currentNums === 0) {
120+
currentNums = childNums;
121+
childNums = 0;
122+
result.push(tempArr);
123+
tempArr = [];
124+
}
125+
}
126+
return result;
127+
}
128+
```
129+
130+
131+
132+
133+
134+
## 题目3-按之字形顺序打印二叉树
135+
136+
### 题目描述
137+
138+
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
139+
140+
需要输出:
141+
142+
```javascript
143+
[
144+
[1],
145+
[3, 2],
146+
[4, 6, 7, 5]
147+
]
148+
```
149+
150+
151+
152+
### 解题思路
153+
154+
**解法一**
155+
156+
可以将题目2中得到的二维数组处理一下:把偶数层的数组使用`reserve`逆序排一下就行了。
157+
158+
159+
160+
**解法二**
161+
162+
每一层是从左到右打印还是从右到左打印是由谁决定的呢?
163+
164+
例如我们定义了一个数组`stack`用来放某个节点下的子节点。
165+
166+
这里有一颗超级简单的树:
167+
168+
```javascript
169+
1
170+
/ \
171+
2 3
172+
```
173+
174+
`stack`是长`[2, 3]`或是长`[3, 2]`,其实只是由`push`的顺序决定的而已。
175+
176+
177+
178+
- 若当前层为奇数层,从左到右打印,同时填充下一层,从右到左打印(先填充左孩子节点再填充右孩子节点)。
179+
- 若当前层为偶数层,从右到左打印,同时填充下一层,从左到右打印(先填充右孩子节点再填充左孩子节点)。
180+
181+
182+
183+
### coding
184+
185+
**解法一**
186+
187+
```javascript
188+
function print (node) {
189+
let result = [];
190+
let tempArr = [];
191+
let currentNums = 1;
192+
let childNums = 0;
193+
let stack = [node];
194+
while (stack.length !== 0) {
195+
node = stack.shift();
196+
tempArr.push(node.value);
197+
if (node.left) {
198+
stack.push(node.left);
199+
childNums++;
200+
}
201+
if (node.right) {
202+
stack.push(node.right);
203+
childNums++;
204+
}
205+
currentNums--;
206+
if (currentNums === 0) {
207+
currentNums = childNums;
208+
childNums = 0;
209+
result.push(tempArr);
210+
tempArr = [];
211+
}
212+
}
213+
result = result.map((arr, idx) => {
214+
return (idx + 1) % 2 === 0 ? arr.reverse() : arr;
215+
})
216+
return result;
217+
}
218+
```
219+
220+
221+
222+
**解法二**
223+
224+
```javascript
225+
function print(node) {
226+
const result = [];
227+
const oddStack = [];
228+
const evenStack = [];
229+
let temp = [];
230+
if (node) {
231+
oddStack.push(node)
232+
while (oddStack.length !== 0 || evenStack.length !== 0) {
233+
while (oddStack.length !== 0) {
234+
const current = oddStack.shift();
235+
temp.push(current.value);
236+
if (current.right) {
237+
evenStack.push(current.right);
238+
}
239+
if (current.left) {
240+
evenStack.push(current.left);
241+
}
242+
}
243+
if (temp.length > 0) {
244+
result.push(temp);
245+
temp = [];
246+
}
247+
while (evenStack.length !== 0) {
248+
const current = evenStack.shift();
249+
temp.push(current.value);
250+
if (current.left) {
251+
oddStack.push(current.left)
252+
}
253+
if (current.right) {
254+
oddStack.push(current.right)
255+
}
256+
}
257+
if (temp.length > 0) {
258+
result.push(temp);
259+
temp = [];
260+
}
261+
}
262+
}
263+
return result;
264+
}
265+
```
266+

0 commit comments

Comments
 (0)