-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path103BTreeZigzagLevelOrderTraversal.cs
161 lines (138 loc) · 5.02 KB
/
103BTreeZigzagLevelOrderTraversal.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _103BTreeZigzagLevelOrderTraversal
{
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
}
class zigZagOrder
{
static void Main(string[] args)
{
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
ArrayList output = zigzagOutput(root);
}
/*
* Reference:
*
* http://rleetcode.blogspot.ca/2014/02/binary-tree-zigzag-level-order.html
* Time Complexity is O(n)
Take advantage of two stack
one is used hold current level's node another is used to hold next level's hold,
moreover there is flag used to mark the sequece (left to rigth or right to left)
put the root first into curretn stack then pop it out, put left and right into next_level stack
(pay attention to sequence)
once current stack is empty swap current and next level, level ++,
reverse sequence
*
* Julia's comment:
* 1. Go through online judge
* 2. Improve code readability, and improve the code -
* 3. Read more blogs about this problem and its solutions through leetcode blog, understand
* better about various solution, and coding level, use best code for me to memorize.
* 4. Write down the thought process, extension discussion etc.
*/
public static ArrayList zigzagOutput(TreeNode root)
{
ArrayList result = new ArrayList();
if (root == null)
return null;
Stack<TreeNode> currLevel = new Stack<TreeNode>();
Stack<TreeNode> nextLevel = new Stack<TreeNode>();
Stack<TreeNode> tmp;
currLevel.Push(root);
bool normalOrder = true;
int level = 0;
ArrayList temp = new ArrayList();
while (currLevel.Count != 0)
{
if (result.Count == level)
{
temp = new ArrayList();
result.Add(temp);
}
ArrayList cResult = new ArrayList();
while (currLevel.Count != 0)
{
TreeNode node = currLevel.Pop();
temp.Add(node.val);
if (normalOrder)
{
if (node.left != null)
nextLevel.Push(node.left);
if (node.right != null)
nextLevel.Push(node.right);
}
else
{
if (node.right != null)
nextLevel.Push(node.right);
if (node.left != null)
nextLevel.Push(node.left);
}
}
if (currLevel.Count == 0)
{
tmp = currLevel;
currLevel = nextLevel;
nextLevel = tmp;
normalOrder = !normalOrder;
level++;
}
}
return result;
}
public static ArrayList zigzagOutput_2while(TreeNode root)
{
ArrayList result = new ArrayList();
if (root == null)
return null;
Stack<TreeNode> currLevel = new Stack<TreeNode>();
Stack<TreeNode> nextLevel = new Stack<TreeNode>();
Stack<TreeNode> tmp;
currLevel.Push(root);
bool normalOrder = true;
while (currLevel.Count != 0)
{
ArrayList cResult = new ArrayList();
while (currLevel.Count != 0)
{
TreeNode node = currLevel.Pop();
cResult.Add(node.val);
if (normalOrder)
{
if (node.left != null)
nextLevel.Push(node.left);
if (node.right != null)
nextLevel.Push(node.right);
}
else
{
if (node.right != null)
nextLevel.Push(node.right);
if (node.left != null)
nextLevel.Push(node.left);
}
}
result.Add(cResult);
tmp = currLevel;
currLevel = nextLevel;
nextLevel = tmp;
normalOrder = !normalOrder;
}
return result;
}
}
}