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日

相关文章

  • 斜率优化入门

    前言 斜率优化是一种经典的单调队列优化类型,虽然它的名字很高大上,但是其思想内核非常简单,这篇博客就是用来帮助各位快速入门的 提示:本博客以单调队列的思想理解斜率优化 引入 dp 优化可以怎么分类? 数据结构维护决策点集的插入与查找 算法维护决策点集大小,取出无用决策点 而斜率优化 dp 属于第二者,且常常用于优化序列分割问题 Q1 P3195 A1 先列出…

    算法与数据结构 2023年4月17日
    00
  • 数据结构之堆详解

    数据结构之堆详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构。堆具有以下两个特点: 堆是一颗完全二叉树; 堆中每个节点的值都必须大于等于或小于等于其左右子节点的值,分别称作大根堆和小根堆。 上述的大根堆和小根堆其实是两种不同的堆的实现方式。对于大根堆,每个节点的值都比其左右子节点的值要大;小根堆则相反,每个节点的值都比其左右子节点的值要小。 堆的基本…

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

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

    数据结构 2023年5月16日
    00
  • 数据结构基本概念和术语之位字节、字、位串、元素等

    我们先来一一解释数据结构中的基本概念和术语: 1. 位 位是计算机中的最小存储单位,通常表示二进制0或1。8个位组成了1个字节,常用于表示和处理计算机中的文件、数据、程序等。 2. 字节 字节是计算机中的基本存储单位之一,由8个位组成,通常表示1个英文字符或者1个二进制数。在计算机存储中,通常以字节为单位进行数据的存储与传输。 3. 位串 一个由0或1构成的…

    数据结构 2023年5月17日
    00
  • Java红黑树的数据结构与算法解析

    Java红黑树的数据结构与算法解析 红黑树简介 红黑树是一种平衡二叉搜索树,其中的每个节点上都有一个黑色或红色的标记,并且满足以下性质: 根节点是黑色的; 叶子节点是黑色的空节点(NULL); 如果一个节点是红色的,则其子节点必须是黑色的; 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点; 新插入的节点默认是红色的。 具体来说,只有在删除或者某…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之单链表的实例详解

    Go语言数据结构之单链表的实例详解 简介 单链表是一个常见的数据结构,它由一系列节点组成,每个节点包含一个值和指向下一个节点的引用。单链表的插入和删除操作比较容易,但是访问操作的效率相对较低。 在Go语言中,可以使用结构体配合指针来实现单链表。 实现思路 为了实现单链表,需要先定义一个节点结构体Node,包含一个value值和一个next指针。通过next指…

    数据结构 2023年5月17日
    00
  • C++数据结构深入探究栈与队列

    C++数据结构深入探究栈与队列 简介 栈和队列是常见的数据结构,尤其在程序设计和算法中都是不可或缺的。本文将深入讲解C++中栈和队列的实现原理和基本操作,并提供两个示例说明其应用。 栈(Stack)基本操作 栈的定义 栈是一种线性数据结构,具有后进先出(Last In First Out, LIFO)的特点。栈可以用数组或链表实现。 栈的操作 push() …

    数据结构 2023年5月17日
    00
  • 数据结构之哈夫曼树与哈夫曼编码

    一、背景 编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。但其在传输和存储等情况下编码效率不高。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例] 将百分制的考试成绩转换成五分制的成绩 按顺序分别编码。 按频率分别编码(高频短编码,类似于香…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部