二叉树的深度优先遍历分为三种:
(1).前序遍历,即先遍历根节点,然后遍历左子树,最后遍历右子树。
(2).中序遍历,即先遍历左子树,然后遍历根节点,最后遍历右子树。
(3).后续遍历,即先遍历左子树,然后遍历右子树,最后遍历根节点。
递归的实现方式就比较简单了,对于如下的二叉树:
A
/ \
B C
/ \ \
D E F
我们的前序遍历结果就是:
ABDECF
我们先来给出一个使用递归的遍历吧:
package com.mengzhidu.teach.algorithm.tree.demo.traversal;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;
/**
* 这里采用递归的方式来进行前序遍历
* Created by xinxing on 2019/3/20
*/
public class PreOrderDemo1 {
public static void main(String[] args) {
preOrder(TreeNodeHelper.getTreeNode());
}
private static void preOrder(TreeNode treeNode) {
if (treeNode == null) {
return;
}
System.out.println(treeNode.getValue());
preOrder(treeNode.getLeft());
preOrder(treeNode.getRight());
}
}
然后我们给出前序遍历的非递归实现,其实也比较简单。
因为凡是可以用递归实现的,都可以用栈来实现。
我们只需要稍加改造即可:
package com.mengzhidu.teach.algorithm.tree.demo.traversal;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;
import java.util.Stack;
/**
* Created by xinxing on 2019/3/20
* 非递归的方式来实现树的遍历
*/
public class PreOrderDemo2 {
public static void main(String[] args) {
Stack<TreeNode> stack = new Stack<>();
TreeNode root = TreeNodeHelper.getTreeNode();
stack.push(root);
while (!stack.empty()) {
TreeNode tmp = stack.pop();
if (tmp == null) {
continue;
}
System.out.println(tmp.getValue());
stack.push(tmp.getRight());
stack.push(tmp.getLeft());
}
}
}
对于树的前序遍历,就介绍到这里啦。