二叉搜索树(搜索、添加、遍历)——Java

栈、队列、链表都有他们各自的好处,同样的也有弊端的存在。

如果我想要一个有序的数组和链表这个当然很好实现。现在我要在这几个数据结构中查找一个值。先说数组,因为是有序的通过二分查找很快的就可以找到。查找的效率还是很高的,但如果要是插入呢,为了保证有序,我要先找到插入位置,然后再将比插入数字大的数字依次向后移动;这时的第一反应就是链表!他打插入速度很快,只要改变指针的指向就可以了。但是链表大查找要从头开始找啊。只有知道了前一个元素的地址才能知道下一个地址。所以链表查找起来又费劲了。这时候就有人引进了树。

树也分很多种,只说特殊的二叉树中的二叉搜索树。

二叉搜索树定义:一个节点的左子节点的关键自值小于这个节点,右子节点的关键字值大于或等于这个父节点。

二叉搜索树插入的时候可以直接改变左树右树的指针指向,查找的时候可以根据排序二叉树的特点。

这就是一个二叉搜索树

现在开始用代码来描述这棵树。先看节点类

package test;
/**
 * 树节点类
 */
public class TreeNode
{
    public int keyValue;    //关键字值
    public TreeNode leftNode;//左节点
    public TreeNode rightNode;//右节点  

    public TreeNode(){}
    public TreeNode(int Key)
   {
        this.keyValue = Key;
    }
} 

代码不多,描述了一个节点的内容。关于二叉搜索树的描述主要从查询节点、添加节点、遍历、最大值、最小值、删除节点来描述。这里不包括存在相等节点的情况。

查询节点:这个比较简单,根据二叉树的定义查询就可以了。看图写代码最方便。

再看代码

public TreeNode search(int Key)
{
        TreeNode node = root;
        // 首先定义一个节点让其指向根,在下面的循环中
        // 只要节点值不等于要查找的节点值就进入循环如果没有找到则返回null
        while (node.keyValue != Key)
{
            if (Key < node.keyValue)
           { // 如果要查找的值小于节点值则指向左节点
                node = node.leftNode;
            }
            else
           { // 否则指向右节点
                node = node.rightNode;
            }
            if (node == null)
           { // 如果节点为空了则返回null
                return null;
            }
        }
        return node;
    }  

添加节点,添加节点的过程是现搜索再添加。先看图

代码如下:

public void insert(int Key) {
        TreeNode node = new TreeNode(Key);
        // 添加节点之前首先要找到要添加的位置,这样就要记住要添加节点的父节点
        // 让父节点的左右指向要添加的节点
        if (root == null) { // 如果根结点为空,则根节点指向新节点
            root = node;
        } else {
            TreeNode currentNode = root;// 定义当前节点并指向根节点
            TreeNode parentNode;
            while (true) { // 寻找节点添加的位置
                parentNode = currentNode;
                if (Key < currentNode.keyValue) {
                    currentNode = currentNode.leftNode;
                    if (currentNode == null) { // 当找到空节点的时候,父节点的左节点指向新节点
                        parentNode.leftNode = node;
                        return;
                    }
                } else {
                    currentNode = currentNode.rightNode;
                    if (currentNode == null) { // 当找到空节点的时候,父节点的右节点指向新节点
                        parentNode.rightNode = node;
                        return;
                    }
                }
            }
        }
    } 

遍历树:遍历分为中序遍历(最常用,也最有用),前序遍历,后续遍历。

这里就发一个中序遍历的图,理解了这个前序和后续都很好理解。

public void display(TreeNode node)
{
        if (node != null)
        {
            display(node.leftNode);
            System.out.println(node.keyValue + ",");
            display(node.rightNode);
        }
    } 

最大值、最小值:这个就不用说了,最大值一直往右走,最小值一直往左走。

直接上代码:

public int max()
{
    TreeNode node = root;
    TreeNode parent = null;
    while (node != null)
  {
        parent = node;
        node = node.rightNode;
    }
    return parent.keyValue;
}  

public int min()
{
    TreeNode node = root;
    TreeNode parent = null;
    while (node != null)
   {
        parent = node;
        node = node.leftNode;
    }
    return parent.keyValue;
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 18:42:18

二叉搜索树(搜索、添加、遍历)——Java的相关文章

二叉搜索树的后续遍历

给定一个整型数组,判断这个数组是否可能是一棵二叉搜索树后续遍历的结果? 由于二叉搜索树的特性,任何一个节点它的左子树中的节点都比这个节点值小,右子树中的节点都比这个节点值大,那么经过后续遍历后的数组应该有一个特性,就是数组中前面一部分元素比最后一个元素值小,后面那部分元素值都比最后一个元素值大.并且前面这部分元素和后面这部分元素也符合同样的规律,根据这个特性,可以用递归求解. 如下图: 代码如下: #include "util.h" /*二叉搜索树的后续遍历 * 输入一个数组,判断该数

Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作

什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T extends Comparable<? super T>> { /** * 节点储存的值 */ private T data; /** * 左子节点 */ private Node<T> leftNode; /** * 右子节点 */ private Node<T>

剑指offer:二叉搜索树的后续遍历序列

题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路: 根据二叉搜索的性质,后序遍历是先搜索左子树,再右子数,最后是根结点.对应到序列中就是,序列的最后一位为根结点,从头开始遍历序列中一段连续子序列小于根结点,为左子树,后一段连续子序列大于根结点,为右子树. 举个例子,序列为(2,4,3,6,7,5),则5为根结点,对应(2,4,3)都小于5,为左子树,(6,7)大于5,为右子树.再对每个

剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如输入数组{5,7,6,9,11,10,8}则返回true,因为这个整数序列是下图二叉树的后序遍历的结果.如果输入的数组是{7,4,6,5},由于没有哪颗二叉搜索树的后续遍历的结果是这个序列,因此返回false. 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根节点的值

二叉搜索树的遍历

------------------siwuxie095 二叉搜索树的遍历 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

PTA 7-28 搜索树判断(镜像二叉搜索树的后序遍历)

算法源代码在 Veeupup Github 考点: 二叉搜索树遍历方式和性质运用 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列. 输入格式: 输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说

二叉搜索树的后序遍历判断

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 之前对于二叉搜索树,只知道中序遍历是递增的,今天做到这道题目,要求判断数组是不是二叉搜索树后序遍历的结果,一开始有点懵,后来在纸上画画,感觉很像递归的感觉,有一种特别像归并排序的那种感觉一样,然后发现对于每一个树的子结构而言,我们将其分成左右子树两部分就可以很明白这种递归的结构了,分成两部分,然后分别对左右在递归,直到叶子节点 1 public c

二叉树--二叉搜索树

一直对AVL这个英文缩写比较困惑,原来一直以为是平衡二叉树的首字母缩写,但是又想不明白,哈!前段时间才明白原来是种这课树的三个人的名字的首字母的,哎,生活处处有惊喜,无知不可怕,现在我也知道了.废话不多说,下面我们说说,树形结构中的那些平衡二叉树. 二叉排序树 树的遍历顺序有3种,二叉排序树,顾名思义,就是一颗有序的二叉树,是一种按照中序遍历树中节点,而输出有序队列的一种树形结构,一种特殊的树形结构. 定义 对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为

二叉搜索树的局限性

-------------------siwuxie095 二叉搜索树的局限性 二叉搜索树在时间性能上是具有局限性的 同样的数据,可以对应不同的二叉搜索树,如下: 二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树 的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜 索树相应的算法全部退化成 O(n) 级别 显然,说二叉搜索树的查找.插入.删除 这三个操作都是 O(lgn) 级别的, 只是一个大概的估算,具体要和二叉搜索树的形状相关 二叉搜索树并不能像堆那样,保证所