二叉树深度遍历的深度优先就是偏向于纵向,“一头扎到底”的访问方式。深度优先遍历主要分为前序遍历、中序遍历、后序遍历。
举例
遍历如下二叉树:
1、前序遍历输出顺序是:先输出父节点,再遍历左子树和右子树。
/**
* 树的节点
*/
class TreeNode{
public int rank;//排名
public String name;//姓名
public TreeNode left;//左节点
public TreeNode right;
/**
* 构造函数
* @param rank
* @param name
*/
public TreeNode(int rank,String name){
this.rank = rank;
this.name = name;
}
@Override
public String toString() {
return "TreeNode{" +
"rank=" + rank +
", name='" + name + '\'' +
'}';
}
}
/**
* 二叉树的遍历
*/
class BinaryTree{
/**
* 前序遍历
* @param node
*/
public void preOrderTraversal(TreeNode node){
if (node == null){
return;
}
System.out.println(node);
preOrderTraversal(node.left);
preOrderTraversal(node.right);
}
}
public class BinaryTreeDemo {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
TreeNode root = new TreeNode(1, "宋江");
TreeNode node2 = new TreeNode(2, "卢俊义");
TreeNode node3 = new TreeNode(3, "吴用");
TreeNode node4 = new TreeNode(4, "公孙胜");
TreeNode node5 = new TreeNode(5, "关胜");
TreeNode node6 = new TreeNode(6, "林冲");
root.left = node3;
root.right = node2;
node2.right = node4;
node2.left = node5;
node3.right = node6;
binaryTree.preOrderTraversal(root);
}
}
2、中序遍历输出顺序是:先遍历左子树,再输出父节点,再遍历右子树。
/**
* 树的节点
*/
class TreeNode{
public int rank;//排名
public String name;//姓名
public TreeNode left;//左节点
public TreeNode right;
/**
* 构造函数
* @param rank
* @param name
*/
public TreeNode(int rank,String name){
this.rank = rank;
this.name = name;
}
@Override
public String toString() {
return "TreeNode{" +
"rank=" + rank +
", name='" + name + '\'' +
'}';
}
}
/**
* 二叉树的遍历
*/
class BinaryTree{
/**
* 中序遍历
* @param node
*/
public void inOrderTraversal(TreeNode node){
if (node == null){
return;
}
inOrderTraversal(node.left);
System.out.println(node);
inOrderTraversal(node.right);
}
}
public class BinaryTreeDemo {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
TreeNode root = new TreeNode(1, "宋江");
TreeNode node2 = new TreeNode(2, "卢俊义");
TreeNode node3 = new TreeNode(3, "吴用");
TreeNode node4 = new TreeNode(4, "公孙胜");
TreeNode node5 = new TreeNode(5, "关胜");
TreeNode node6 = new TreeNode(6, "林冲");
root.left = node3;
root.right = node2;
node2.right = node4;
node2.left = node5;
node3.right = node6;
binaryTree.preOrderTraversal(root);
}
}
3、后序遍历输出顺序是:先遍历左子树,再遍历右子树,最后输出父节点。
/**
* 树的节点
*/
class TreeNode{
public int rank;//排名
public String name;//姓名
public TreeNode left;//左节点
public TreeNode right;
/**
* 构造函数
* @param rank
* @param name
*/
public TreeNode(int rank,String name){
this.rank = rank;
this.name = name;
}
@Override
public String toString() {
return "TreeNode{" +
"rank=" + rank +
", name='" + name + '\'' +
'}';
}
}
/**
* 二叉树的遍历
*/
class BinaryTree{
/**
* 后序遍历
* @param node
*/
public void postOrderTraversal(TreeNode node){
if (node == null){
return;
}
postOrderTraversal(node.left);
postOrderTraversal(node.right);
System.out.println(node);
}
}
public class BinaryTreeDemo {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
TreeNode root = new TreeNode(1, "宋江");
TreeNode node2 = new TreeNode(2, "卢俊义");
TreeNode node3 = new TreeNode(3, "吴用");
TreeNode node4 = new TreeNode(4, "公孙胜");
TreeNode node5 = new TreeNode(5, "关胜");
TreeNode node6 = new TreeNode(6, "林冲");
root.left = node3;
root.right = node2;
node2.right = node4;
node2.left = node5;
node3.right = node6;
binaryTree.preOrderTraversal(root);
}
}