Java数据结构学习之二叉树

Java数据结构学习之二叉树

什么是二叉树

二叉树是一种树形数据结构,他的每个节点最多有两个子节点,分别称为左子节点和右子节点。如果一个节点没有子节点,则成为叶子节点。二叉树具有以下性质:

  • 每个节点最多有两个子节点
  • 左子树和右子树是二叉树
  • 二叉树可以为空

二叉树的遍历

为了遍历一棵树,我们可以采用两种算法:

深度优先遍历

深度优先遍历的思路是:从根节点出发,一直走到该方向没有节点为止,然后回溯到上一个节点,再取另一个子节点,重复执行直到遍历完整棵树。

二叉树有三种深度优先遍历方法:

前序遍历

前序遍历的访问顺序是:先访问该节点的值,然后遍历它的左子树,最后遍历右子树。

示例:

   1
 /   \
2     3

前序遍历的结果为:1 2 3

中序遍历

中序遍历的访问顺序是:先遍历左子树,然后访问该节点的值,最后遍历右子树。

示例:

   1
 /   \
2     3

中序遍历的结果为:2 1 3

后序遍历

后序遍历的访问顺序是:先遍历左子树,然后遍历右子树,最后访问该节点的值。

示例:

   1
 /   \
2     3

后序遍历的结果为: 2 3 1

广度优先遍历

广度优先遍历的思路是:从根节点开始,先遍历根节点,然后遍历它的所有子节点,再遍历子节点的子节点,一层一层地遍历下去。

广度优先遍历可以使用队列来实现。

示例:

   1
 /   \
2     3

广度优先遍历的结果为:1 2 3

二叉树的实现

在Java中,我们可以使用类来实现二叉树。

public class TreeNode {
    public int val;
    public TreeNode left, right;

    public TreeNode(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}

我们定义一个TreeNode类,它有三个属性:

  • val:节点的值
  • left:左子节点
  • right:右子节点

二叉搜索树

二叉搜索树是二叉树的一种特殊形式,在二叉搜索树中,每个节点的值都比它左子树中的所有节点的值大,比右子树中的所有节点的值小。

二叉搜索树有以下特点:

  • 左子树中所有节点的值都比根节点的值小
  • 右子树中所有节点的值都比根节点的值大
  • 左右子树分别也是二叉搜索树

二叉搜索树的遍历和普通二叉树一样,只需要根据节点值的大小关系和遍历顺序来区分即可。

二叉搜索树的实现

public class BinarySearchTree {
    private TreeNode root;

    public BinarySearchTree() {
        root = null;
    }

    public void insert(int val) {
        root = insert(root, val);
    }

    private TreeNode insert(TreeNode root, int val) {
        if (root == null) {
            root = new TreeNode(val);
        } else if (val < root.val) {
            root.left = insert(root.left, val);
        } else if (val > root.val) {
            root.right = insert(root.right, val);
        }
        return root;
    }

    public void inorderTraversal() {
        inorderTraversal(root);
    }

    private void inorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        inorderTraversal(root.left);
        System.out.print(root.val + " ");
        inorderTraversal(root.right);
    }
}

我们定义一个BinarySearchTree类,它有一个属性root,表示二叉搜索树的根节点。它有两个方法:

  • insert:插入一个节点
  • inorderTraversal:中序遍历二叉搜索树

示例说明

示例一

假设我们要将下面这些数字插入到二叉搜索树中,并进行中序遍历:

5 2 7 1 3

我们定义一个BinarySearchTree实例,依次插入这些数字,然后进行中序遍历:

BinarySearchTree tree = new BinarySearchTree();
tree.insert(5);
tree.insert(2);
tree.insert(7);
tree.insert(1);
tree.insert(3);
tree.inorderTraversal();

输出结果为:

1 2 3 5 7

示例二

假设我们要对下面这棵二叉树进行前序遍历:

   1
 /   \
2     3

我们定义一个TreeNode实例,然后进行前序遍历:

TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
preorderTraversal(root);

输出结果为:

1 2 3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构学习之二叉树 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构之迷宫问题

    C语言数据结构之迷宫问题 迷宫问题是一种基本的搜索问题,其中需要在一个矩阵中寻找从起点到终点的路径。在本篇文章中,我们将以C语言为例,介绍迷宫问题的完整攻略。 准备工作 在开始之前,我们先要准备好数据结构。为了表示迷宫,我们使用一个二维数组。其中,0表示可以通过的路,1表示障碍物不可通过。为了记录路径,我们还需要使用一个二维数组来表示每个格子是否已经被访问过…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之排序总结(一)

    好的!首先感谢你对我的提问,我将会在这里详细讲解“C语言数据结构与算法之排序总结(一)”的完整攻略。 概述 本文是关于 C 语言数据结构与算法中排序总结(一)的攻略说明。主要包括目录、排序算法、排序分析和示例演示等内容,让读者能够了解排序算法的基本思想、常见的分类和应用场景,以及不同排序算法的优缺点,进而选择适合的排序算法。 目录 基本概念 冒泡排序 插入排…

    数据结构 2023年5月17日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

    数据结构 2023年5月17日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
  • java数据结构与算法数组模拟队列示例详解

    下面是“java数据结构与算法数组模拟队列示例详解”的完整攻略。 标题 Java数据结构与算法:数组模拟队列示例详解 简介 本文将以Java语言为例,详细讲解如何使用数组模拟队列。对于初学者来说,队列是一个非常基础的数据结构,掌握其实现方法可以帮助进一步理解其他的数据结构和算法。 队列的定义 队列(Queue)是一种先进先出(First In First O…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现链表逆序并输出

    下面是C语言数据结构实现链表逆序并输出的完整攻略。 1. 题目分析 本题目要求实现对链表的逆序,并依次输出各节点的值。而链表的逆序可以通过改变各节点之间的连接方式来实现。 2. 思路分析 创建一个指针,指向原链表的头结点。 遍历链表,将每个节点的next指针指向它前面的节点,从而实现链表的逆序。 遍历逆序后的链表,从头结点开始,依次输出每个节点的值。 3. …

    数据结构 2023年5月17日
    00
  • Java数据结构之链表实现(单向、双向链表及链表反转)

    Java数据结构之链表实现 链表基础概念 链表是一种数据结构,它由一系列节点(Node)组成,每个节点包含两个部分,一个是数据域(data),一个是指针域(next)。数据域存储数据信息,指针域指向下一个节点。 链表的种类很多,比如单向链表、双向链表、循环链表等等。 单向链表:链表的每个节点只有一个指针域,指向下一个节点。 双向链表:链表的每个节点有两个指针…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表的概念及结构

    Java数据结构之链表的概念及结构 链表的概念 链表是一种非顺序存储的容器,它由一个个结点组成,每个结点包含两部分,数据域和指针域。数据域是存储数据的部分,指针域是指向下一个结点的位置。 相比于数组,链表插入和删除操作的时间复杂度更低,但是访问元素时需要遍历整个链表,时间复杂度相对较高。 链表的结构 链表结构包含两个重要的部分:结点和链表。 结点(Node)…

    数据结构 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部