数据结构150-二叉搜索树-删除节点没有子节点代码

简介: 数据结构150-二叉搜索树-删除节点没有子节点代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>封装二叉搜索树</title>
  </head>
  <body>
    <script>
      function BinarySearchTree() {
        function Node(key) {
          this.key = null;
          this.left = null;
          this.right - null;
        }
        this.root = null;
        BinarySearchTree.prototype.insert = function (key) {
          var newNode = new Node(key);
          //判断节点是否有值
          if (this.root == null) {
            this.root = newNode;
          } else {
            this.insertNode(this.root, newNode);
          }
        };
        BinarySearchTree.prototype.insertNode = function (node, newNode) {
          if (newNode.key < node.key) {
            if (node.left == null) {
              node.left = newNode;
            } else {
              this.insertNode(node.left, newNode);
            }
          } else {
            if (node.right == null) {
              node.right = newNode;
            } else {
              this.insertNode(node.right, newNode);
            }
          }
        };
        //先序遍历
        BinarySearchTree.prototype.preOrderTraversal = function (handler) {
          this.preOrderTraversalNode(this.root, handler);
        };
        BinarySearchTree.prototype.preOrderTraversalNode = function (
          node,
          handler
        ) {
          if (node != null) {
            //处理经过的节点
            handler(node.key);
            this.preOrderTraversalNode(node.left, handler);
            this.preOrderTraversalNode(node.right, handler);
          }
        };
        //中序遍历
        BinarySearchTree.prototype.middleOrderTraversal = function (handler) {
          this.middleOrderTraversalNode(this.root, handler);
        };
        BinarySearchTree.prototype.middleOrderTraversalNode = function (
          node,
          handler
        ) {
          if (node != null) {
            //处理经过的节点
            handler(node.key);
            this.preOrderTraversalNode(node.left, handler);
            handler(node.key)
            this.preOrderTraversalNode(node.right, handler);
          }
        };
        //中序遍历
        BinarySearchTree.prototype.postOrderTraversal = function (handler) {
          this.postOrderTraversalNode(this.root, handler);
        };
        BinarySearchTree.prototype.postOrderTraversalNode = function (
          node,
          handler
        ) {
          if (node != null) {
            //处理经过的节点
            handler(node.key);
            this.postOrderTraversalNode(node.left, handler);
            this.postOrderTraversalNode(node.right, handler);
            handler(node.key)
          }
        };
        BinarySearchTree.prototype.max = function (){
            var node=this.root
            var key=null
            while(node!=null){
                key=node.key
                node=node.right
            }
            return key
        }
        BinarySearchTree.prototype.min = function (){
            var node=this.root
            var key=null
            while(node!=null){
                key=node.key
                node=node.left
            }
            return key
        }
        BinarySearchTree.prototype.search = function (){
            var node=this.root
            while(node!=key){
                if(key<node.key){
                    node=node.left
                }else if(key>node.key){
                    node=node.key
                }else{
                  return  true
                }
            }
            return false
        }
        BinarySearchTree.prototype.remove = function (key){
            //
            var current=this.root
            var parent=null
            var isLeftChild=true
            while(current.key!=key){
                parent=current
                if(key<current.key){
                    isLeftChild=true
                    current=current.left
                }else{
                    isLeftChild=false
                    current=current.right
                }
                //已经找最后节点
                if(current==null) return false
            }
            //
            if(current.left==null&¤t.right==null){
                if(current==this.root){
                    this.root=null
                }else if(isLeftChild){
                    parent.left=null
                }else{
                    parent.right=null
                }
            }
        }
      }
    </script>
  </body>
</html>
相关文章
|
7月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
244 1
|
8月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
328 22
|
8月前
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
709 9
|
12月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
412 1
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
144 1
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
1013 9
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
287 59
|
5月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
117 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
10月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
500 77

热门文章

最新文章

下一篇
oss云网关配置