数据结构——树的遍历

本文深入探讨了树这种重要的数据结构,详细介绍了树的基本概念,包括根节点、子节点和尾节点。接着,文章阐述了四种树的遍历方式:前序遍历、中序遍历、后序遍历和层级遍历,并提供了每种遍历的Java实现。这些遍历方法是理解和操作树结构的关键,对于数据库索引、算法实现等领域至关重要。
摘要由CSDN通过智能技术生成

数据结构——树的遍历

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值