二叉树的遍历(递归与非递归)
前序遍历/深度优先遍历(递归)
- 如图

public static void dfs(Node treeNode) {
if (treeNode) {
System.out.println(treeNode.data);//调整输出语句的前中后位置,实现前序,中序,dsf(treeNode.left);
dfs(treeNode.left);
dfs(treeNode.right);
}
}
前序遍历/深度优先遍历(非递归)
- 使用栈来存储节点,现将根节点压栈,然后进入while,然后弹栈检查此节点是否还有未遍历的节点,有的话先压右,后压左(因为栈先进后出,保证了先遍历左枝),没有的话不断回溯(出栈)
public static void dfsStack(Node root) {
Stack<Node> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
Node treeNode = stack.pop();
System.out.println(treeNode.data);
if (treeNode.right != NUll) {
stack.push(treeNode.right);
}
if (treeNode.left != NUll) {
stack.push(treeNode.left);
}
}
}
广度优先遍历/层序遍历
- 如图

- 用队列存储节点,现将根节点压入队列,然后进入while,然后出队列检查左右儿子节点是否存在,有的话先压左,后压右(因为队列先进先出,保证了先遍历左枝),把队列遍历为空截止
public static void bfs(Node root) {
Queue<Node> queue = new LinkedList<>();
queue.push(root);
while (!queue.isEmpty()) {
Node treeNode = queue.pop();
System.out.println(treeNode.data);
if (treeNode.left != NUll) {
stack.push(treeNode.left);
}
if (treeNode.right != NUll) {
stack.push(treeNode.right);
}
}
}