文章目录
数据结构——树的遍历
1.树的基本概念
树是一种非常有用的数据结构,数据库的实现很多底层实现是基于树结构的,比如mysql innodb存储引擎的索引就是基于B+树的。树是一种由节点组成的数据结构,但它比链表更加高级,在链表中,一个节点连接着另一个节点,树也是由许多的节点构成的,唯一的区别就是一个树节点可以连接多个树节点,一颗树只有一个根节点,根节点作为起源,由它展开一个树状的数据结构。
在实现树之前,我们来了解一下树的基本定义:
在树中,每个节点都含有自己的数值,以及与之相连的子节点,连接节点的线叫做相连线(edge)。如下图所示,A是根节点(root),也是B和C的父节点(parent node),也就是说B、C都是A的子节点(child node)。同理,B是D和E的父节点,以此类推。要注意H、I、J、F、G都是尾节点(leaf node),因为它们位于树的最底部,没有任何子节点。
2.树的遍历 Tree Traversal
不像数组,在树中我们无法随时获取任意节点,遍历树总是从根节点开始,树的遍历有4种遍历树的方式:
前序遍历 (Pre-order Traversal)
中序遍历 (In-order Traversal)
后序遍历 (Post-order Traversal)
层级遍历(Level Traversal)
节点类
static class TreeNode {
public String value;
public TreeNode left;
public TreeNode right;
public TreeNode(String value) {
this.value = value;
}
}
3.前序遍历 Preorder Traversal
前序遍历也叫先根遍历,即先访问节点自己,然后访问左子树,最后再访问右子树,对于每个节点迭代此操作:
public static void preOrderTraversal(TreeNode root) {
if(root == null) {
return;
}
System.out.println(root.value);
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
4.中序遍历 Inorder Traversal
在中序遍历中,先访问左子树上的节点,再访问自己,最后再访问右子树上的节点:
public static void inOrderTraversal(TreeNode root) {
if(root == null) {
return;
}
inOrderTraversal(root.left);
System.out.println(root.value);
inOrderTraversal(root.right);
}
5.后序遍历 Postorder Traversal
在后序遍历中,先访问左右子树,最后再访问自己:
public static void postOrderTraversal(TreeNode root) {
if(root == null) {
return;
}
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.println(root.value);
}
6.层级遍历 Level Traversal
层序遍历,则需要借助一个队列:要访问的节点全部放到队列里。当访问一个节点时,就让它的子节点入队,依次访问。
public static void printTreeLevelOrder( TreeNode root ){
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while ( !queue.isEmpty() ){
TreeNode curNode = queue.poll();
System.out.print(curNode.value + "\t");
if ( curNode.left != null )
queue.offer(curNode.left);
if ( curNode.right != null )
queue.offer(curNode.right);
}
}