使用比较统一迭代方法实现三种遍历
1.
1.
1. 在学习《代码随想录》看到的一种方法,可以严格保持三种遍历顺序的入栈顺序;
2.
2.
2. 前序遍历顺序:中左右;入栈顺序:右中左;
3.
3.
3. 中序遍历顺序:左中右;入栈顺序:右中左;
4.
4.
4. 后序遍历顺序:左右中;入栈顺序:中右左;
5.
5.
5. 该方法将“中结点”push入栈后,会push一个null进栈作为标记待pop。
class Solution {
public List<Integer> preorder(TreeNode root) {
List<Integer> result = new LinkedList<>();
Stack<TreeNode> st = new Stack<>();
if (root != null) st.push(root);
while (!st.empty()) {
TreeNode node = st.peek();
if (node != null) {
st.pop();
if (node.right!=null) st.push(node.right);
if (node.left!=null) st.push(node.left);
st.push(node);
st.push(null);
} else {
st.pop();
node = st.peek();
st.pop();
result.add(node.val);
}
}
return result;
}
public List<Integer> midorder(TreeNode root) {
List<Integer> result = new LinkedList<>();
Stack<TreeNode> st = new Stack<>();
if (root != null) st.push(root);
while (!st.empty()) {
TreeNode node = st.peek();
if (node != null) {
st.pop();
if (node.right!=null) st.push(node.right);
st.push(node);
st.push(null);
if (node.left!=null) st.push(node.left);
} else {
st.pop();
node = st.peek();
st.pop();
result.add(node.val);
}
}
return result;
}
public List<Integer> postorder(TreeNode root) {
List<Integer> result = new LinkedList<>();
Stack<TreeNode> st = new Stack<>();
if (root != null) st.push(root);
while (!st.empty()) {
TreeNode node = st.peek();
if (node != null) {
st.pop();
st.push(node);
st.push(null);
if (node.right!=null) st.push(node.right);
if (node.left!=null) st.push(node.left);
} else {
st.pop();
node = st.peek();
st.pop();
result.add(node.val);
}
}
return result;
}
}
|