目录
二叉树的前序遍历
顺序为 中、左、右
/*方法二: 迭代的方式
*/
public List<Integer> preOrder2(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
// Stack<TreeNode> stack = new Stack<>();//也是stack
if (root == null) return result;
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
result.add(node.val);
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
}
return result;
}
/*
方法一: 递归方式
*/
public List<Integer> preOrder1(TreeNode root) {
List<Integer> result = new ArrayList<>();
preOrder(root, result);
return result;
}
private void preOrder(TreeNode root, List<Integer> result) {
if (root == null) return;
result.add(root.val);
preOrder(root.left, result);
preOrder(root.right, result);
}
二叉树的前中序遍历
顺序为 左、中、右
/**
* 方法二:迭代
*
* @param root
* @return
*/
public List<Integer> inOrder2(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}//到达最左边节点
TreeNode node = stack.pop();
result.add(node.val);
if (node.right != null) {
root = node.right;
}
}
return result;
}
/**
* 方法一:递归
*
* @param root
* @return
*/
public List<Integer> inOrder(TreeNode root) {
List<Integer> result = new ArrayList<>();
inOrder(root, result);
return result;
}
private void inOrder(TreeNode root, List<Integer> list) {
if (root == null) return;
inOrder(root.left, list);
list.add(root.val);
inOrder(root.right, list);
}
二叉树的前后序遍历
顺序为 左、右、中
/**
* 方法一: 递归
*
* @param root
* @return
*/
public List<Integer> postOrder(TreeNode root) {
List<Integer> result = new ArrayList<>();
postOrder(root, result);
return result;
}
private void postOrder(TreeNode root, List<Integer> result) {
if (root != null) {
postOrder(root.left, result);
postOrder(root.right, result);
result.add(root.val);
}
}
/**
* 方法二: 迭代
* 利用二叉树的前序遍历的思想,前序遍历是 中->左->右,
* 只需要在递归的时候先把左节点压入栈,结果就是中->右->左
* 最后,只需要翻转一下 就变成了左->右->中 也就是后续遍历
*/
public List<Integer> postOrder2(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) return result;
Deque<TreeNode> stack = new LinkedList<>();
stack.add(root);
while (!stack.isEmpty()) {
root = stack.pop();
result.add(root.val);
if (root.left != null) stack.push(root.left);
if (root.right != null) stack.push(root.right);
}
Collections.reverse(result);
return result;
}