先序遍历就是按照 根节点 => 左子树 => 右子树 的顺序访问。
其实:
先序、中序、后序遍历,主要是对根节点读取顺序而言的。
下面介绍下两种具体的遍历方法。
1、首先先定义一个树节点类信息,如下:
package com.dz.demo.algorithm;
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
2、递归调用比较简单,具体如下:
private static void preOrderRecursive(TreeNode root) {
if (root == null) return;
System.out.println(root.val);
preOrderRecursive(root.left);
preOrderRecursive(root.right);
}
3、非递归的方法主要是借助栈结构来完成:
private static void preOrderUnRecursive(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.empty()) {
TreeNode temp = stack.pop();
if (temp == null) continue;
System.out.println(temp.val);
// 明确栈的进出顺序,先进后出,所以先序遍历,先push右子树
stack.push(temp.right);
stack.push(temp.left);
}
}
4、测试,如下二叉树:
public static void main(String[] args) {
TreeNode root = new TreeNode(5);
TreeNode cLeft1 = new TreeNode(3);
TreeNode cRight1 = new TreeNode(7);
TreeNode clLeft2 = new TreeNode(2);
TreeNode clRight2 = new TreeNode(4);
TreeNode crLeft2 = new TreeNode(6);
TreeNode crRight2 = new TreeNode(8);
root.left = cLeft1;
root.right = cRight1;
cLeft1.left = clLeft2;
cLeft1.right = clRight2;
cRight1.left = crLeft2;
cRight1.right = crRight2;
// preOrderRecursive(root);
preOrderUnRecursive(root);
}
5、结果如下:
Connected to the target VM, address: '127.0.0.1:55176', transport: 'socket'
5
3
2
4
7
6
8
Disconnected from the target VM, address: '127.0.0.1:55176', transport: 'socket'
Process finished with exit code 0