Skip to content

Commit e4d23ee

Browse files
committed
feat: update solutions to lc problem: No.0144
No.0144.Binary Tree Preorder Traversal
1 parent 2d9a5a9 commit e4d23ee

File tree

7 files changed

+342
-248
lines changed

7 files changed

+342
-248
lines changed

solution/0100-0199/0144.Binary Tree Preorder Traversal/README.md

+144-101
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070

7171
非递归的思路如下:
7272

73-
1. 定义一个栈,先将根节点压入栈
73+
1. 定义一个栈 stk,先将根节点压入栈
7474
2. 若栈不为空,每次从栈中弹出一个节点
7575
3. 处理该节点
7676
4. 先把节点右孩子压入栈,接着把节点左孩子压入栈(如果有孩子节点)
@@ -83,10 +83,10 @@ Morris 遍历无需使用栈,空间复杂度为 O(1)。核心思想是:
8383

8484
遍历二叉树节点,
8585

86-
1. 若当前节点 root 的左子树为空,**将当前节点值添加至结果列表 res** 中,并将当前节点更新为 `root.right`
87-
2. 若当前节点 root 的左子树不为空,找到左子树的最右节点 pre(也即是 root 节点在中序遍历下的前驱节点):
88-
- 若前驱节点 pre 的右子树为空,**将当前节点值添加至结果列表 res** 中,然后将前驱节点的右子树指向当前节点 root,并将当前节点更新为 `root.left`
89-
- 若前驱节点 pre 的右子树不为空,将前驱节点右子树指向空(即解除 pre 与 root 的指向关系),并将当前节点更新为 `root.right`
86+
1. 若当前节点 root 的左子树为空,**将当前节点值添加至结果列表 ans** 中,并将当前节点更新为 `root.right`
87+
2. 若当前节点 root 的左子树不为空,找到左子树的最右节点 prev(也即是 root 节点在中序遍历下的前驱节点):
88+
- 若前驱节点 prev 的右子树为空,**将当前节点值添加至结果列表 ans** 中,然后将前驱节点的右子树指向当前节点 root,并将当前节点更新为 `root.left`
89+
- 若前驱节点 prev 的右子树不为空,将前驱节点右子树指向空(即解除 prev 与 root 的指向关系),并将当前节点更新为 `root.right`
9090
3. 循环以上步骤,直至二叉树节点为空,遍历结束。
9191

9292
<!-- tabs:start -->
@@ -105,17 +105,18 @@ Morris 遍历无需使用栈,空间复杂度为 O(1)。核心思想是:
105105
# self.left = left
106106
# self.right = right
107107
class Solution:
108-
def preorderTraversal(self, root: TreeNode) -> List[int]:
109-
res = []
110-
111-
def preorder(root):
112-
if root:
113-
res.append(root.val)
114-
preorder(root.left)
115-
preorder(root.right)
116-
117-
preorder(root)
118-
return res
108+
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
109+
def dfs(root):
110+
if root is None:
111+
return
112+
nonlocal ans
113+
ans.append(root.val)
114+
dfs(root.left)
115+
dfs(root.right)
116+
117+
ans = []
118+
dfs(root)
119+
return ans
119120
```
120121

121122
栈实现非递归:
@@ -128,18 +129,19 @@ class Solution:
128129
# self.left = left
129130
# self.right = right
130131
class Solution:
131-
def preorderTraversal(self, root: TreeNode) -> List[int]:
132-
res = []
133-
if root:
134-
s = [root]
135-
while s:
136-
node = s.pop()
137-
res.append(node.val)
138-
if node.right:
139-
s.append(node.right)
140-
if node.left:
141-
s.append(node.left)
142-
return res
132+
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
133+
ans = []
134+
if root is None:
135+
return ans
136+
stk = [root]
137+
while stk:
138+
node = stk.pop()
139+
ans.append(node.val)
140+
if node.right:
141+
stk.append(node.right)
142+
if node.left:
143+
stk.append(node.left)
144+
return ans
143145
```
144146

145147
Morris 遍历:
@@ -152,24 +154,24 @@ Morris 遍历:
152154
# self.left = left
153155
# self.right = right
154156
class Solution:
155-
def preorderTraversal(self, root: TreeNode) -> List[int]:
156-
res = []
157+
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
158+
ans = []
157159
while root:
158160
if root.left is None:
159-
res.append(root.val)
161+
ans.append(root.val)
160162
root = root.right
161163
else:
162-
pre = root.left
163-
while pre.right and pre.right != root:
164-
pre = pre.right
165-
if pre.right is None:
166-
res.append(root.val)
167-
pre.right = root
164+
prev = root.left
165+
while prev.right and prev.right != root:
166+
prev = prev.right
167+
if prev.right is None:
168+
ans.append(root.val)
169+
prev.right = root
168170
root = root.left
169171
else:
170-
pre.right = None
172+
prev.right = None
171173
root = root.right
172-
return res
174+
return ans
173175
```
174176

175177
### **Java**
@@ -195,18 +197,21 @@ class Solution:
195197
* }
196198
*/
197199
class Solution {
200+
private List<Integer> ans;
201+
198202
public List<Integer> preorderTraversal(TreeNode root) {
199-
List<Integer> res = new ArrayList<>();
200-
preorder(root, res);
201-
return res;
203+
ans = new ArrayList<>();
204+
dfs(root);
205+
return ans;
202206
}
203207

204-
private void preorder(TreeNode root, List<Integer> res) {
205-
if (root != null) {
206-
res.add(root.val);
207-
preorder(root.left, res);
208-
preorder(root.right, res);
208+
private void dfs(TreeNode root) {
209+
if (root == null) {
210+
return;
209211
}
212+
ans.add(root.val);
213+
dfs(root.left);
214+
dfs(root.right);
210215
}
211216
}
212217
```
@@ -231,22 +236,23 @@ class Solution {
231236
*/
232237
class Solution {
233238
public List<Integer> preorderTraversal(TreeNode root) {
234-
List<Integer> res = new ArrayList<>();
235-
if (root != null) {
236-
Deque<TreeNode> s = new LinkedList<>();
237-
s.offerLast(root);
238-
while (!s.isEmpty()) {
239-
TreeNode node = s.pollLast();
240-
res.add(node.val);
241-
if (node.right != null) {
242-
s.offerLast(node.right);
243-
}
244-
if (node.left != null) {
245-
s.offerLast(node.left);
246-
}
239+
List<Integer> ans = new ArrayList<>();
240+
if (root == null) {
241+
return ans;
242+
}
243+
Deque<TreeNode> stk = new ArrayDeque<>();
244+
stk.push(root);
245+
while (!stk.isEmpty()) {
246+
TreeNode node = stk.pop();
247+
ans.add(node.val);
248+
if (node.right != null) {
249+
stk.push(node.right);
250+
}
251+
if (node.left != null) {
252+
stk.push(node.left);
247253
}
248254
}
249-
return res;
255+
return ans;
250256
}
251257
}
252258
```
@@ -271,27 +277,27 @@ Morris 遍历:
271277
*/
272278
class Solution {
273279
public List<Integer> preorderTraversal(TreeNode root) {
274-
List<Integer> res = new ArrayList<>();
280+
List<Integer> ans = new ArrayList<>();
275281
while (root != null) {
276282
if (root.left == null) {
277-
res.add(root.val);
283+
ans.add(root.val);
278284
root = root.right;
279285
} else {
280-
TreeNode pre = root.left;
281-
while (pre.right != null && pre.right != root) {
282-
pre = pre.right;
286+
TreeNode prev = root.left;
287+
while (prev.right != null && prev.right != root) {
288+
prev = prev.right;
283289
}
284-
if (pre.right == null) {
285-
res.add(root.val);
286-
pre.right = root;
290+
if (prev.right == null) {
291+
ans.add(root.val);
292+
prev.right = root;
287293
root = root.left;
288294
} else {
289-
pre.right = null;
295+
prev.right = null;
290296
root = root.right;
291297
}
292298
}
293299
}
294-
return res;
300+
return ans;
295301
}
296302
}
297303
```
@@ -314,17 +320,54 @@ class Solution {
314320
*/
315321

316322
function preorderTraversal(root: TreeNode | null): number[] {
317-
if (root == null) return [];
318-
let stack = [];
319323
let ans = [];
320-
while (root || stack.length) {
321-
while (root) {
324+
if (!root) return ans;
325+
let stk = [root];
326+
while (stk.length) {
327+
let node = stk.pop();
328+
ans.push(node.val);
329+
if (node.right) stk.push(node.right);
330+
if (node.left) stk.push(node.left);
331+
}
332+
return ans;
333+
}
334+
```
335+
336+
```ts
337+
/**
338+
* Definition for a binary tree node.
339+
* class TreeNode {
340+
* val: number
341+
* left: TreeNode | null
342+
* right: TreeNode | null
343+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
344+
* this.val = (val===undefined ? 0 : val)
345+
* this.left = (left===undefined ? null : left)
346+
* this.right = (right===undefined ? null : right)
347+
* }
348+
* }
349+
*/
350+
351+
function preorderTraversal(root: TreeNode | null): number[] {
352+
let ans = [];
353+
while (root) {
354+
if (!root.left) {
322355
ans.push(root.val);
323-
stack.push(root);
324-
root = root.left;
356+
root = root.right;
357+
} else {
358+
let prev = root.left;
359+
while (prev.right && prev.right != root) {
360+
prev = prev.right;
361+
}
362+
if (!prev.right) {
363+
ans.push(root.val);
364+
prev.right = root;
365+
root = root.left;
366+
} else {
367+
prev.right = null;
368+
root = root.right;
369+
}
325370
}
326-
root = stack.pop();
327-
root = root.right;
328371
}
329372
return ans;
330373
}
@@ -346,36 +389,36 @@ function preorderTraversal(root: TreeNode | null): number[] {
346389
*/
347390
class Solution {
348391
public:
349-
vector<int> preorderTraversal(TreeNode *root) {
350-
vector<int> res;
392+
vector<int> preorderTraversal(TreeNode* root) {
393+
vector<int> ans;
351394
while (root)
352395
{
353-
if (root->left == nullptr)
396+
if (!root->left)
354397
{
355-
res.push_back(root->val);
398+
ans.push_back(root->val);
356399
root = root->right;
357400
}
358401
else
359402
{
360-
TreeNode *pre = root->left;
361-
while (pre->right && pre->right != root)
403+
TreeNode* prev = root->left;
404+
while (prev->right && prev->right != root)
362405
{
363-
pre = pre->right;
406+
prev = prev->right;
364407
}
365-
if (pre->right == nullptr)
408+
if (!prev->right)
366409
{
367-
res.push_back(root->val);
368-
pre->right = root;
410+
ans.push_back(root->val);
411+
prev->right = root;
369412
root = root->left;
370413
}
371414
else
372415
{
373-
pre->right = nullptr;
416+
prev->right = nullptr;
374417
root = root->right;
375418
}
376419
}
377420
}
378-
return res;
421+
return ans;
379422
}
380423
};
381424
```
@@ -392,27 +435,27 @@ public:
392435
* }
393436
*/
394437
func preorderTraversal(root *TreeNode) []int {
395-
var res []int
438+
var ans []int
396439
for root != nil {
397440
if root.Left == nil {
398-
res = append(res, root.Val)
441+
ans = append(ans, root.Val)
399442
root = root.Right
400443
} else {
401-
pre := root.Left
402-
for pre.Right != nil && pre.Right != root {
403-
pre = pre.Right
444+
prev := root.Left
445+
for prev.Right != nil && prev.Right != root {
446+
prev = prev.Right
404447
}
405-
if pre.Right == nil {
406-
res = append(res, root.Val)
407-
pre.Right = root
448+
if prev.Right == nil {
449+
ans = append(ans, root.Val)
450+
prev.Right = root
408451
root = root.Left
409452
} else {
410-
pre.Right = nil
453+
prev.Right = nil
411454
root = root.Right
412455
}
413456
}
414457
}
415-
return res
458+
return ans
416459
}
417460
```
418461

0 commit comments

Comments
 (0)