数据结构——树的遍历

文章目录

  • 数据结构——树的遍历
    • 1.树的基本概念
    • 2.树的遍历 Tree Traversal
    • 3.前序遍历 Preorder Traversal
    • 4.中序遍历 Inorder Traversal
    • 5.后序遍历 Postorder Traversal
    • 6.层级遍历 Level Traversal

数据结构——树的遍历

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),因为它们位于树的最底部,没有任何子节点。
数据结构——树的遍历_第1张图片

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);
    }
}

你可能感兴趣的:(数据结构和算法,数据结构,java,树的遍历)