1
+ /*
2
+ Author: Annie Kim, [email protected]
3
+ Date: Nov 11, 2013
4
+ Problem: Binary Tree Preorder Traversal
5
+ Difficulty: Easy
6
+ Source: http://oj.leetcode.com/problems/binary-tree-preorder-traversal/
7
+ Notes:
8
+ Given a binary tree, return the preorder traversal of its nodes' values.
9
+ For example:
10
+ Given binary tree {1,#,2,3},
11
+ 1
12
+ \
13
+ 2
14
+ /
15
+ 3
16
+ return [1,2,3].
17
+ Note: Recursive solution is trivial, could you do it iteratively?
18
+
19
+ Solution: 1. Iterative way (stack). Time: O(n), Space: O(n).
20
+ 2. Recursive solution. Time: O(n), Space: O(n).
21
+ 3. Threaded tree (Morris). Time: O(n), Space: O(1).
22
+ */
23
+ /* *
24
+ * Definition for binary tree
25
+ * struct TreeNode {
26
+ * int val;
27
+ * TreeNode *left;
28
+ * TreeNode *right;
29
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
30
+ * };
31
+ */
32
+ class Solution {
33
+ public:
34
+ vector<int > preorderTraversal (TreeNode *root) {
35
+ return preorderTraversal_3 (root);
36
+ }
37
+
38
+ vector<int > preorderTraversal_1 (TreeNode *root) {
39
+ vector<int > res;
40
+ stack<TreeNode *> stk;
41
+ TreeNode *cur = root;
42
+ while (cur || !stk.empty ())
43
+ {
44
+ if (cur)
45
+ {
46
+ res.push_back (cur->val );
47
+ stk.push (cur);
48
+ cur = cur->left ;
49
+ }
50
+ else if (!stk.empty ())
51
+ {
52
+ cur = stk.top ()->right ;
53
+ stk.pop ();
54
+ }
55
+ }
56
+ return res;
57
+ }
58
+
59
+ vector<int > preorderTraversal_2 (TreeNode *root) {
60
+ vector<int > res;
61
+ preorderTraversalRe (root, res);
62
+ return res;
63
+ }
64
+
65
+ void preorderTraversalRe (TreeNode *node, vector<int > &res) {
66
+ if (!node) return ;
67
+ res.push_back (node->val );
68
+ preorderTraversalRe (node->left , res);
69
+ preorderTraversalRe (node->right , res);
70
+ }
71
+
72
+ vector<int > preorderTraversal_3 (TreeNode *root) {
73
+ vector<int > res;
74
+ TreeNode *cur = root;
75
+ while (cur)
76
+ {
77
+ if (cur->left )
78
+ {
79
+ TreeNode *prev = cur->left ;
80
+ while (prev->right && prev->right != cur)
81
+ prev = prev->right ;
82
+
83
+ if (prev->right == cur)
84
+ {
85
+ cur = cur->right ;
86
+ prev->right = NULL ;
87
+ }
88
+ else
89
+ {
90
+ res.push_back (cur->val );
91
+ prev->right = cur;
92
+ cur = cur->left ;
93
+ }
94
+ }
95
+ else
96
+ {
97
+ res.push_back (cur->val );
98
+ cur = cur->right ;
99
+ }
100
+ }
101
+ return res;
102
+ }
103
+ };
0 commit comments