7
7
#==================================================
8
8
9
9
from typing import List
10
-
10
+ import collections
11
11
# Definition for a binary tree node.
12
12
class TreeNode :
13
13
def __init__ (self , val = 0 , left = None , right = None ):
@@ -20,16 +20,18 @@ def preorderTraversal(self, root: TreeNode) -> List[int]:
20
20
if root is None : return []
21
21
stack , res = [root ], []
22
22
while stack :
23
- tmp = stack .pop ()
24
- res .append (tmp .val )
25
- if tmp .right : stack .append (tmp .right )
26
- if tmp .left : stack .append (tmp .left )
23
+ node = stack .pop ()
24
+ res .append (node .val )
25
+ if node .right :
26
+ stack .append (node .right )
27
+ if node .left :
28
+ stack .append (node .left )
27
29
return res
28
30
29
31
def preorderTraversalRecursion (self , root : TreeNode ) -> List [int ]:
30
32
def preorder (root ):
31
- if not root : return []
32
- res .append (root .val )
33
+ if not root : return
34
+ res .append (root .val )## 前序
33
35
preorder (root .left )
34
36
preorder (root .right )
35
37
return res
@@ -44,16 +46,16 @@ def inorderTraversal(self, root: TreeNode) -> List[int]:
44
46
while cur :
45
47
stack .append (cur )
46
48
cur = cur .left
47
- tmp = stack .pop ()
48
- res .append (tmp .val )
49
- cur = tmp .right
49
+ node = stack .pop ()
50
+ res .append (node .val )
51
+ cur = node .right
50
52
return res
51
53
52
54
def inorderTraversalRecursion (self , root : TreeNode ) -> List [int ]:
53
55
def inorder (root ):
54
- if not root : return []
56
+ if not root : return
55
57
inorder (root .left )
56
- res .append (root .val )
58
+ res .append (root .val )## 中序
57
59
inorder (root .right )
58
60
return res
59
61
res = []
@@ -69,41 +71,100 @@ def postorderTraversal(self, root: TreeNode) -> List[int]:
69
71
res .append (node .val )
70
72
else :
71
73
stack .append ((1 , node ))
72
- if node .right : stack .append ((0 , node .right ))
73
- if node .left : stack .append ((0 , node .left ))
74
+ if node .right :
75
+ stack .append ((0 , node .right ))
76
+ if node .left :
77
+ stack .append ((0 , node .left ))
74
78
return res
75
79
76
80
def postorderTraversalRecursion (self , root : TreeNode ) -> List [int ]:
77
81
def postorder (root ):
78
- if not root : return []
82
+ if not root : return
79
83
postorder (root .left )
80
84
postorder (root .right )
81
- res .append (root .val )
85
+ res .append (root .val )## 后序
82
86
return res
83
87
res = []
84
88
postorder (root )
85
89
return res
86
90
87
- def levelOrder (self , root : TreeNode ) -> List [List [int ]]:
91
+ def levelTraversalLeft (self , root : TreeNode ) -> List [List [int ]]:
92
+ if not root : return []
93
+ res , queue = [], collections .deque ()
94
+ queue .append (root )
95
+ while queue :
96
+ n , level = len (queue ), []
97
+ for _ in range (n ):
98
+ node = queue .popleft ()
99
+ level .append (node .val )
100
+ if node .left :
101
+ queue .append (node .left )
102
+ if node .right :
103
+ queue .append (node .right )
104
+ res .append (level )
105
+ return res
106
+
107
+ def levelTraversalRight (self , root : TreeNode ) -> List [List [int ]]:
88
108
if not root : return []
89
- res , q = [], [ root ]
90
- while q :
91
- n = len ( q )
92
- level = []
109
+ res , queue = [], collections . deque ()
110
+ queue . append ( root )
111
+ while queue :
112
+ n , level = len ( queue ), []
93
113
for _ in range (n ):
94
- node = q . pop ( 0 )
114
+ node = queue . popleft ( )
95
115
level .append (node .val )
96
- if node .left : q .append (node .left )
97
- if node .right : q .append (node .right )
116
+ if node .right :
117
+ queue .append (node .right )
118
+ if node .left :
119
+ queue .append (node .left )
98
120
res .append (level )
99
121
return res
100
122
123
+ def levelTraversal (self , root : TreeNode , k = - 1 ) -> List [List [int ]]:
124
+ if not root : return []
125
+ res , queue = [], collections .deque ()
126
+ queue .append (root )
127
+ while queue :
128
+ n , level = len (queue ), collections .deque ()
129
+ for _ in range (n ):
130
+ node = queue .popleft ()
131
+ if k == - 1 : ## 左 --> 右
132
+ level .append (node .val )
133
+ else : ## 右 --> 左
134
+ level .appendleft (node .val )
135
+ if node .left :
136
+ queue .append (node .left )
137
+ if node .right :
138
+ queue .append (node .right )
139
+ res .append (list (level ))
140
+ return res
141
+
142
+ def levelTraversalJagged (self , root : TreeNode , k = - 1 ) -> List [List [int ]]:
143
+ if not root : return []
144
+ res , queue = [], collections .deque ()
145
+ queue .append (root )
146
+ while queue :
147
+ n , level = len (queue ), collections .deque ()
148
+ k *= - 1
149
+ for _ in range (n ):
150
+ node = queue .popleft ()
151
+ if k == - 1 : ## 左 --> 右
152
+ level .append (node .val )
153
+ else : ## 右 --> 左
154
+ level .appendleft (node .val )
155
+ if node .left :
156
+ queue .append (node .left )
157
+ if node .right :
158
+ queue .append (node .right )
159
+ res .append (list (level ))
160
+ return res
161
+
101
162
def maxDepth (self , root : TreeNode ) -> int :
102
163
def bottomUp (root ):
103
164
return 0 if not root else max (bottomUp (root .left ), bottomUp (root .right )) + 1
104
- def topDown (root , depth ):
165
+ def topDown (root , depth = 0 ):
105
166
return depth if not root else max (topDown (root .left , depth + 1 ), topDown (root .right , depth + 1 ))
106
- return topDown (root , 0 ), bottomUp (root )
167
+ return topDown (root ), bottomUp (root )
107
168
108
169
mat = Solution ()
109
170
## 前序
@@ -115,6 +176,7 @@ def topDown(root, depth):
115
176
116
177
root .right = TreeNode (5 )
117
178
root .right .left = TreeNode (6 )
179
+
118
180
print ("\n 前序输出:" )
119
181
print (mat .preorderTraversal (root ))
120
182
print (mat .preorderTraversalRecursion (root ))
@@ -133,19 +195,19 @@ def topDown(root, depth):
133
195
print (mat .inorderTraversalRecursion (root ))
134
196
135
197
## 后序
136
- root = TreeNode (6 )
198
+ # root = TreeNode(6)
137
199
138
- root .left = TreeNode (3 )
139
- root .left .left = TreeNode (1 )
140
- root .left .right = TreeNode (2 )
200
+ # root.left = TreeNode(3)
201
+ # root.left.left = TreeNode(1)
202
+ # root.left.right = TreeNode(2)
141
203
142
- root .right = TreeNode (5 )
143
- root .right .left = TreeNode (4 )
144
- print ("\n 后序输出:" )
145
- print (mat .postorderTraversal (root ))
146
- print (mat .postorderTraversalRecursion (root ))
204
+ # root.right = TreeNode(5)
205
+ # root.right.left = TreeNode(4)
206
+ # print("\n后序输出:")
207
+ # print(mat.postorderTraversal(root))
208
+ # print(mat.postorderTraversalRecursion(root))
147
209
148
- ## 层序
210
+ # # # 层序
149
211
root = TreeNode (1 )
150
212
151
213
root .left = TreeNode (2 )
@@ -155,7 +217,14 @@ def topDown(root, depth):
155
217
root .right = TreeNode (3 )
156
218
root .right .left = TreeNode (6 )
157
219
print ("\n 层序输出:" )
158
- print (mat .levelOrder (root ))
220
+ print (mat .levelTraversalLeft (root ))
221
+ print (mat .levelTraversalRight (root ))
222
+
223
+ print (mat .levelTraversal (root ))
224
+ print (mat .levelTraversal (root , 1 ))
225
+
226
+ print (mat .levelTraversalJagged (root ))
227
+ print (mat .levelTraversalJagged (root , 1 ))
159
228
160
229
print ('\n 最大树深度:' )
161
230
mat .maxDepth (root )
0 commit comments