`
lxwt909
  • 浏览: 572087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

采用[二叉排序树]实现:判断给定的一个数字x是否在指定的一个无序的数字序列中存在

阅读更多
package tree.binarytree;

import java.util.Random;

/**
 * Created by Lanxiaowei
 * Craated on 2016/12/12 17:14
 * 判断给定的一个数字x是否在指定的一个无序的数字序列中存在
 * 采用二叉排序树方式实现
 */
public class TestBinarySortTree {

    public static void main(String[] args) {
        //测试100次
        test(100);
    }

    /**
     * 测试方法
     * @param times    测试的总次数
     */
    public static void test(int times) {
        if(times <= 0) {
            throw new IllegalArgumentException("The number [times] MUST be greater than zero.");
        }

        while(times-- > 0) {
            System.out.println("/**********************华丽的分割线 begin************************/");
            int min = 1;
            int max = 100;
            //先随机生成一个随机数作为二叉树的父节点
            int parentVal = random(min,max);
            //打印生成的parent节点数值
            System.out.println("Parent:" + parentVal);
            //创建二叉树的父节点
            BinarySortTreeNode parentNode = new BinarySortTreeNode(parentVal);
            //假设我们的无序数字序列的长度n=10,这里我们随机生成无序数字序列里的每个数字,然后插入二叉树结构中
            int n = 10;
            //用于存储每个子节点的数值
            int num = 0;
            //这里之所以是n - 2,是因为我们已经生成了父节点,剩下我们只需要生成n - 1个子节点,
            //而i是从零开始的,因此这里是n - 2
            for(int i=0; i < n - 2; i++) {
                //随机生成每个子节点的数值
                num = random(min,max);
                System.out.println("Child:" + num);
                //创建每个子节点
                BinarySortTreeNode child = new BinarySortTreeNode(num);
                //往二叉排序树里插入子节点
                parentNode.insert(parentNode,child);
            }

            //随机生成我们待查找的数字x
            int x = random(min,max);
            //查找数字x是否在二叉树中存在
            boolean exists = parentNode.search(parentNode,x);
            System.out.println("Number x[" + x + "] exists in binary sorted tree?:" + exists);
            System.out.println("/**********************华丽的分割线 end**************************/\n");
        }
    }

    /**
     * 二叉排序树的每个节点
     */
    public static class BinarySortTreeNode {
        //左子节点
        private BinarySortTreeNode left;
        //右子节点
        private BinarySortTreeNode right;
        /**节点上的值*/
        private int val;

        public BinarySortTreeNode() {}

        public BinarySortTreeNode(int val) {
            this.val = val;
        }

        /**
         * 往指定的父节点上插入一个子节点
         * @param parentNode    父节点
         * @param newNode       待插入的节点
         * @return
         */
        public boolean insert(BinarySortTreeNode parentNode, BinarySortTreeNode newNode) {
            if(null == parentNode) {
                throw new IllegalArgumentException("Parent Node MUST be specified.");
            }
            //若待插入的节点数值大于等于父节点,则待插入的newNode此时应该在右边
            if(parentNode.val <= newNode.val) {
                //如果父节点此刻的右树为空,那么就将待插入的newNode作为父节点右树的父节点
                if(parentNode.right == null) {
                    parentNode.right = newNode;
                    return true;
                } else {
                    //如果父节点的右树不为空,那么就插入到右树的父节点下
                    return insert(parentNode.right, newNode);
                }
            }
            //若待插入的节点数值大于等于父节点,则待插入的newNode此时应该在左边
            if(parentNode.val > newNode.val) {
                //如果父节点此刻的左树为空,那么就将待插入的newNode作为父节点左树的父节点
                if(parentNode.left == null) {
                    parentNode.left = newNode;
                    return true;
                } else {
                    //如果父节点的左树不为空,那么就插入到左树的父节点下
                    return insert(parentNode.left, newNode);
                }
            }
            return false;
        }

        /**
         * 在指定的父节点为parentNode的二叉树下查找是否存在一个数字x
         * @param parentNode  二叉树的父节点
         * @param x           待查找的数字x
         * @return
         */
        public boolean search(BinarySortTreeNode parentNode, int x) {
            //如果二叉树为null,直接return false
            if(null == parentNode) {
                return false;
            }
            //此时说明找到数字x了,直接return true
            if(parentNode.val == x) {
                return true;
            }
            //此时应该在右子树中查找
            if(parentNode.val < x) {
                return search(parentNode.right,x);
            }
            //此时应该在左子树中查找
            if(parentNode.val > x) {
                return search(parentNode.left,x);
            }
            return false;
        }
    }

    /**
     * 生成[min,max)区间内的随机数
     * @param min
     * @param max
     * @return
     */
    public static int random(int min,int max) {
        Random random = new Random();
        return random.nextInt(max)%(max - min + 1) + min;
    }
}

 

分享到:
评论

相关推荐

    数据结构---二叉排序树

    该课题是用来描述二叉排序树的,给定一列整型的数据(无序),按照二叉排序树的思想将该列数据排成一个有序的序列(通过中序遍历该二叉树可以得到一个非递减有序序列)。通过该二叉排序树可以快速的查找所需的数据...

    Python 树表查找_千树万树梨花开,忽如一夜春风来(二叉排序树、平衡二叉树).doc

    对于一个给定的无序数列,例如[5,12,4,45,32,8,10,50,32,3],每次插入新元素时,如果元素小于当前节点值,则插入到左子树;如果元素大于当前节点值,则插入到右子树。这个过程一直持续到找到合适的位置插入新元素,...

    C语言数据结构 广工 作业系统 09.查找

    - 判断一棵二叉树是否为二叉排序树,可以利用中序遍历的特性,即中序遍历得到的结果应该是一个递增序列。 #### 判别算法实现 - 函数 `Status IsBSTree(BiTree t)` 实现了这一功能。 - 使用辅助函数 `GetInt(BiTree...

    exp9--查找实验1

    在给定的递增有序整型数组A中,构建一棵平衡的二叉排序树,可以采用AVL树或红黑树等自平衡二叉搜索树结构。第一组和第二组数据提供了数组元素,用于构建平衡的二叉排序树。 实验任务涵盖了数据结构和算法的基础知识...

    中南大学数据结构与算法第9章查找课后作业答案.docx

    在二叉排序树中查找363,序列(a)是可能的,因为它遵循了二叉排序树的查找规则。然而,序列(b)是不可能的,因为924在220之前,但在二叉排序树中,所有小于924的节点都应该在220之前出现。 总结,查找是数据结构与...

    12 数据结构期末试题汇编.docx

    - 在二分法查找中,平均查找长度与序列长度有关,而对于平衡的二叉排序树,查找长度取决于树的高度。通过具体的计算可以得出平均查找长度。 #### 五、程序题解析 **程序题示例代码填写** ```c++ int Search_Bin...

    数据结构10排序PPT学习教案.pptx

    排序的目标是将一个无序的数据序列重新排列成按照特定关键字(如数字或字符串)有序的序列。例如,给定一组人的年龄和体重数据,排序可以按照年龄升序或降序进行。排序分为稳定排序和不稳定排序。稳定排序保证了...

    2021年台湾省数据高级.docx

    判断一个二叉树是否为二叉排序树需要检查每个节点的左子树和右子树是否满足条件。 7. **快速排序的思想**: - 快速排序是一种高效的排序算法,内容中的quickpass函数使用了快速排序的基本思想,通过选取一个基准...

    数据结构-实验8查找的算法.doc

    实验要求创建一个二叉排序树,然后判断其合法性,以及非递归查找关键字6。创建二叉排序树通常通过插入操作完成,合法性判断则需遍历所有节点,确保每个节点满足二叉排序树的定义。查找6的过程中,可以记录路径以输出...

    数据结构(查找)习题及答案

    - 递归算法OutputNLT用于从大到小输出二叉排序树中所有关键字值不小于x的数据元素,其时间复杂度为O(log2n+m),其中n是排序树中结点数,m是输出的关键字个数。 这些知识点是数据结构中查找算法的基础,理解和掌握...

    数据结构-查找基本操作代码.doc

    在数据结构-查找基本操作代码的另一个部分,引入了二叉排序树,这是一种特殊的二叉树,其中每个节点的左子树只包含键值小于当前节点的元素,右子树包含键值大于当前节点的元素。`InsertBST` 函数实现了二叉排序树的...

    算法-leetcode-剑指offer上的题很多

    - **在旋转排序数组中搜索/Search in Rotated Sorted Array**: 在一个被旋转过的排序数组中搜索给定数字。 - **在旋转排序数组中搜索 II/Search in Rotated Sorted Array II**: 当数组中存在重复元素时,在被旋转过...

    各种排序算法c++版

    堆排序算法通过将给定的无序随机数据调整成一个大顶堆或小顶堆,从而让最大元素或最小元素位于堆顶,然后将堆顶元素与堆的最后一个元素交换,再重新调整剩余元素组成的堆。这个过程不断重复,直到堆的大小为1,此时...

    数据结构查找习题及答案.docx

    1. **题目:** 一个无序序列可以通过构造一棵**二叉搜索树**而变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。 - **解析:** 通过构造二叉搜索树可以实现排序功能。 2. **题目:** 在一棵二叉搜索...

    数据结构第六章自测题试卷答案

    3. 有序与无序:二叉树的子树没有天然的顺序,除非它是特定类型的二叉树,如二叉排序树,其中左子树的节点小于父节点,右子树的节点大于父节点。 4. 子树的配置:二叉树的节点可以有0、1或2个子节点,而不是只能有2...

    中南大学数据结构与算法第9章查找课后作业答案.pdf

    **查找效率**\n - 在一个包含1至1000关键字的二叉排序树中查找363,查找效率取决于树的形态,平衡的树查找效率高,而高度偏斜的树查找效率接近于顺序查找。\n\n以上就是关于中南大学数据结构与算法第9章查找内容的...

    数据结构 考前复习4.docx

    不同的插入顺序可能导致不同的树形状,例如给定的选项展示了不同序列构造二叉排序树的例子。 6. **哈希查找**:通过哈希函数将关键字映射到地址,解决冲突的方法有链地址法、开放地址法、再哈希法等。哈希查找的...

    中国地质大学2011数据结构试卷及其答案.pdf

    - **解释**:在二叉排序树中,左子树中的所有节点的值小于根节点的值,而右子树中的所有节点的值大于根节点的值。根据这个性质,可以判断哪些序列可能是二叉排序树的查找路径。选项A中85作为根节点,但后续的81却...

Global site tag (gtag.js) - Google Analytics