二叉树对象:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
前序、中序、后序:
最初看到二叉树遍历时,第一反应就是从上往下一层一层的遍历,也就是所谓的层序遍历。后来看了许多博客的遍历顺序,就很纳闷,这个莫名其妙的顺序是怎么记得住的,再后来明白了,也就很简单了。二叉树的前序、中序、后序遍历都依赖于递归,通俗的说,就是在前面打印还是在中间打印,异或在后面打印罢了。所以,每次对应不同的树,都是根据如下代码推导出遍历顺序的,千万别死记。
// 前序
public static void print (TreeNode node) {
if (node != null) {
System.out.println(node.val);
print(node.left);
print(node.right);
}
}
// 中序
public static void print (TreeNode node) {
if (node != null) {
print(node.left);
System.out.println(node.val);
print(node.right);
}
}
// 后序
public static void print (TreeNode node) {
if (node != null) {
print(node.left);
print(node.right);
System.out.println(node.val);
}
}
层序:
层序就是按照我们正常的思维来进行遍历,也就是从上往下,从左往右,一层一层的,故称层序。遍历看起来简单,写起来就相对麻烦点,需要借助栈来实现。先将第一层的node存入栈中,然后将其弹出,获取对应value,然后将其 left 和 right 存入栈中,以此类推,每次保证栈中存有下一层的所有node。
// 层序遍历
public ArrayList<Integer> print(TreeNode root) {
ArrayList<Integer> resultList = new ArrayList<>();
if (root == null) {
return resultList;
}
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
TreeNode nowNode = q.peek();
q.poll();
resultList.add(nowNode.val);
if (nowNode.left != null) {
q.add(nowNode.left);
}
if (nowNode.right != null) {
q.add(nowNode.right);
}
}
return resultList;
}