前序遍历
中左右,都是指中间节点的输出顺序
/**
* 迭代实现二叉树的前序遍历 中左右
* @param root
* @return
*/
public static List<Integer> preOrderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
Stack<TreeNode> stack = new Stack<>();
List<Integer> ans = new ArrayList<>();
while (!stack.isEmpty() || root != null) {
while (root != null) {
ans.add(root.val);
stack.push(root);
root = root.left;
}
root = stack.pop();
root = root.right;
}
/*stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
ans.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}*/
return ans;
}
中序遍历
左中右,都是指中间节点的输出顺序
/**
/**
* 迭代法二叉树的中序遍历 左中右
* @param root
* @return
*/
public static List<Integer> inorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> ans = new ArrayList<Integer>();
Deque<TreeNode> stack = new LinkedList<TreeNode>();
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
ans.add(root.val);
root = root.right;
}
return ans;
}
后序遍历
左右中,都是指中间节点的输出顺序
这里可以使用前序遍历
因为前序遍历的顺序是中左右,我们调整左右的输出顺序为中右左
最后再反转列表为左右中
/**
* 反转法实现 左右中
* 先中右左,再列表反转
* @param root
* @return
*/
public static List<Integer> postOrderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Stack<TreeNode> stack = new Stack<>();
while (!stack.isEmpty() || root != null) {
while (root != null) {
ans.add(root.val);
stack.push(root);
root = root.right;
}
root = stack.pop();
root = root.left;
}
Collections.reverse(ans);
return ans;
}