面试整理 - 二叉排序树 c语言 及java 例子

简介: 面试整理 - 二叉排序树 c语言 及java 例子

什么是二叉排序树?

二叉排序树(binary search tree,bst)是一种特殊的二叉树,其中每个节点具有一个键值,并且满足一下两个要求:

  1. 对于任何节点x,其左子树上所有节点的关键字值小于x的关键字值。

  2. 对于任何节点x,其有子树上所有节点的关键字值大于x的关键字值。

由于以上这两个性质,因此二叉排序树也被称为有序二叉树。在执行查找,**,删除等操作时,二叉排序树都可以保持平衡,使得时间复杂度变为o(log n)级别,极大的提高了操作效率。

二叉排序树原理

  1. 二叉排序树中每个结点最多有两个子树,且左子树的所有关键字(节点值)小于当前结点的关键字,右子树的所有关键字大于当前结点的关键字。
  2. 左右子树也都是二叉排序树。
  3. 当某个结点被查找时,比较待查找关键字与当前结点的关键字大小,若相等,则说明查找成功;否则根据大小关系向左或向右子树递归查找,直到找到对应的结点或者确认结点不存在。
  4. 一个新的结点时,从根结点开始将待结点与当前结点进行比较,根据大小关系向左或向右递归到叶子结点停止。然后把新结点**到该叶子结点的左或右子树上。
  5. 当删除一个结点时,按照查找的方式找到需要删除的结点,如果该结点没有子结点,则直接删除即可;如果只有左子树或右子树,则将左子树或右子树直接替换到该结点位置;如果既有左子树又有右子树,则找到该结点的前驱或后继(中序遍历时大于当前结点的最小节点或者小于当前结点的最大节点),然后用其值来替换需要删除的结点的值,并删除前驱或后继。

使用Java实现二叉树排序的示例代码:

// 节点类
class Node {
   
    int value;
    Node left, right;

    public Node(int item) {
   
        value = item;
        left = right = null;
    }
}

public class BinaryTree {
   
    Node root;

    public BinaryTree() {
   
        root = null;
    }

    // 将给定节点的值插入到二叉树中
    private Node insertNode(Node root, int value) {
   
        if (root == null) {
   
            root = new Node(value);
            return root;
        }

        if (value < root.value) {
   
            root.left = insertNode(root.left, value);
        } else if (value > root.value) {
   
            root.right = insertNode(root.right, value);
        }

        return root;
    }

    // 中序遍历,将节点的值按升序返回。
    private void traverseInOrder(Node root, List<Integer> values) {
   
        if (root != null) {
   
            traverseInOrder(root.left, values);
            values.add(root.value);
            traverseInOrder(root.right, values);
        }
    }

    // 对外的排序方法,接收一个整数数组并返回升序排列后的结果。
    public List<Integer> sort(int[] arr) {
   
        for (int i : arr) {
   
            root = insertNode(root, i);
        }

        List<Integer> sortedList = new ArrayList<>();
        traverseInOrder(root, sortedList);

        return sortedList;
    }

    // 测试代码
    public static void main(String[] args) {
   
        BinaryTree tree = new BinaryTree();
        int[] arr = {
   5, 3, 7, 1, 9};

        List<Integer> sortedList = tree.sort(arr);
        System.out.println(sortedList); // Output: [1, 3, 5, 7, 9]
    }
}

该示例中,我们使用节点类Node表示二叉树中的每个节点。二叉树类BinaryTree包含插入节点、中序遍历和排序三个方法

C 语言实现二叉搜索树排序(Binary Search Tree Sorting)的示例代码:

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构体
struct Node {
   
    int data;           // 数据
    struct Node* left;  // 左子节点指针
    struct Node* right; // 右子节点指针
};

// 创建新节点
struct Node* newNode(int data) {
   
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 插入节点
struct Node* insert(struct Node* node, int data) {
   
    if(node == NULL)
        return newNode(data);
    if(data < node->data)
        node->left = insert(node->left, data);
    else if(data > node->data)
        node->right = insert(node->right, data);
    return node;
}

// 遍历节点并按序排列输出结果 
void inorderTraversal(struct Node* node) {
   
    if(node != NULL) {
   
        inorderTraversal(node->left);
        printf("%d ", node->data);
        inorderTraversal(node->right);
    }
}

// 测试示例
int main() {
   
    int arr[] = {
   7, 5, 1, 8, 3, 6, 0, 9, 4, 2};
    int n = sizeof(arr)/sizeof(arr[0]);
    struct Node* root = NULL;

    for(int i=0; i<n; i++)
        root = insert(root, arr[i]);

    inorderTraversal(root);

    return 0;
}

以上是一个简单的二叉搜索树排序的实现,可以根据需要进行修改和优化。

相关文章
|
3月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
6月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
369 1
|
6月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
305 3
|
5月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
483 0
|
5月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
255 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
6月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
3467 48
|
3月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
6月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
187 5
|
6月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
294 5