文章目录
1. 二叉树的前中后序遍历(递归,非递归)以及层序遍历
1.1 二叉树前中后遍历的递归解法
树的前中后序的遍历这个是很常见的问题,其递归做法相对简单,这里直接贴代码:
// 前序遍历
public static void preorder(TreeNode treeNode) {
if (treeNode == null) return;
System.out.print(treeNode.val + " ");
preorder(treeNode.left);
preorder(treeNode.right);
}
// 中序遍历
public static void inorder(TreeNode treeNode) {
if (treeNode == null) return;
inorder(treeNode.left);
System.out.print(treeNode.val + " ");
inorder(treeNode.right);
}
// 后序遍历
public static void postorder(TreeNode treeNode) {
if (treeNode == null) return;
postorder(treeNode.left);
postorder(treeNode.right);
System.out.print(treeNode.val + " ");
}
从上面的代码中可以看到,树的前中后序遍历代码结构基本相同,差距只要在何时输出根值,前序遍历一遍历到节点时,先输出根植,中序是遍历完左子节点,后序是最后才输出,理解起来很容易。
1.2 二叉树前中后遍历的非递归解法
接下来我们来看看如何用非递归的方式,实现前中后序遍历:
1.2.1 非递归的前序遍历:(LeetCode 144)
前序遍历:34、35、29、25、33、42、40、39
根据树前序遍历的特点,我们很容易将其与栈的特点相结合,这里简单附上代码:
// 前序遍历的非递归解法
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> lists = new ArrayList<>();
if (root == null) return lists;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
TreeNode temp = null;
while (!stack.isEmpty()) {
temp = stack.pop();
lists.add(temp.val);
// 这里注意,要先压入右子节点,再压入左节点
if (temp.right != null) {
stack.push(temp.right);
}
if (temp.left != null) {
stack.push(temp.left);
}
}
return lists;
}