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日

相关文章

  • Codeforces Round 871 (Div. 4)

    A.Love Story 题意: 给定n个长度为10的字符串,问其与codeforces字符串的对应下标字母不同的个数。 分析: 对于每个字符串从前往后依次和“codeforces”对应字符比较然后统计不同字母数即可 code: #include <bits/stdc++.h> using namespace std; int main() { …

    算法与数据结构 2023年5月8日
    00
  • java数据结构实现顺序表示例

    如果想要实现一种数据结构,我们首先需要考虑它的存储结构。对于顺序存储结构,Java中的数组是一个很好的选择。下面就为大家分享关于Java数据结构实现顺序表示例的完整攻略,帮助读者更好地理解该数据结构的实现方式。 1. 定义一个顺序表数组 首先,我们需要定义一个数组类型的顺序表。这个顺序表可以使用泛型来表示各种类型的数据: public class MyArr…

    数据结构 2023年5月17日
    00
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历 前言 二叉树是数据结构中至关重要的一种数据结构,对于计算机科学的学习和工作都是至关重要的。而遍历二叉树是二叉树的重要操作之一。 为了帮助读者更好地理解二叉树前、中、后序遍历的过程,本文介绍 Java 数据结构中最清晰的图解二叉树前、中、后序遍历攻略。 什么是二叉树? 二叉树是一种非常重要的数据结构,它由根节点…

    数据结构 2023年5月17日
    00
  • JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解

    JS中的算法与数据结构:二叉查找树(Binary Sort Tree) 什么是二叉查找树 二叉查找树(Binary Sort Tree),又称二叉搜索树或二叉排序树,是一种特殊的二叉树结构。它具有以下性质: 每个结点最多只有两个子结点。 左子树中的所有结点的值均小于它的根结点的值。 右子树中的所有结点的值均大于它的根结点的值。 没有相同节点值出现 因为具备以…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构链表知识详解

    JavaScript数据结构链表知识详解 什么是链表 链表是一种线性结构,相比于数组,它不需要一块连续的内存空间,而是通过指针将一组零散的内存块串联起来使用。链表只保持一个指向链表中第一个节点的引用,每个节点则有指向下一个节点的指针。 链表的实现 链表的实现方式有很多种,下面介绍一种简单的单向链表实现方式,其中每个节点包含一个value属性和一个next属性…

    数据结构 2023年5月17日
    00
  • java数据结构和算法中哈希表知识点详解

    Java数据结构和算法中哈希表知识点详解 什么是哈希表 哈希表是一种以键值对(key-value)形式存储数据的数据结构,通过使用哈希函数将对应的键映射为一个索引,使得数据的添加、删除、查找等操作可以在常数时间内完成。 具体来讲,哈希表主要包含以下几个部分: 哈希函数:将键转换为一个索引,通常使用散列算法实现。 数组:用于存储哈希表的元素(键值对)。 冲突解…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列 什么是栈 栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。 栈的基本操作 初始化栈 入栈 出栈 取栈顶元素 判空 判满 // 栈的…

    数据结构 2023年5月17日
    00
  • Python数据结构之翻转链表

    对于“Python数据结构之翻转链表”的完整攻略,我会按照以下顺序进行讲解: 1.什么是链表? 2.如何翻转链表? 3.示例1:翻转一个简单的链表 4.示例2:翻转一个带环的链表 5.如何在Python中实现翻转链表? 接下来,我会详细讲解每个部分。 什么是链表? 链表是一种数据结构,它由一系列的节点组成,每个节点包含了数据和指向下一个节点的指针。链表有很多…

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