BST 插入节点传新版本(原痛恨JavaScript每一天 __ 没有指针)
2023年2月2日更新
perform代码上传到GitHub了,新方法比老方法慢,不建议在生产环境使用

GitHub地址:https://github.com/Dou-fugan/webDemo/tree/new-way-building-BST
船新版本(2023年1月30日更新)
数据结构就是很正常的 val,left,right
function* f() {
let node = {
... // 构建代码我粘在改代码片段下面了
};
// 3
// / \
// 1 5
// /
// -1
let phantom = function (node,t) {
return {
get () {return node[t] },
set (x) {return node[t] = x}
}
}
let insert = function (node, v) {
if (!node.get()) return node.set({ val: v, next: null })
if (node.get().val < v) insert(phantom(node.get(),'right'), v);
else insert(phantom(node.get(),'left'), v);
};
insert(phantom({left:node},'left'), 2);
insert(phantom({left:node},'left'), 4);
yield node.left.right.val === 2;
yield node.right.left.val === 4;
}
for (const x of f()) {
console.log(x);
}
树:
let node = {
val: 3,
left: {
val: 1,
left: {
val: -1,
left: null,
right: null
},
right: null
},
right: {
val: 5,
left: null,
right: null
}
};
背景 (原帖从这里开始)
二叉搜索树,插入节点
JavaScript解法
function insertNode(root, newNode) {
if (newNode.key < root.key) {
if (root.left) {
insertNode(root.left, newNode);
} else {
root.left = newNode;
}
} else {
if (root.right) {
insertNode(root.right, newNode);
} else {
root.right = newNode;
}
}
}
function insert(root, keys) {
let newNode = new Node(key);
return insertNode(root, newNode);
}
insert(root, key); // 4, 3, 5, 9, 8, 2, 12, 6
c++ 解法
#include <iostream>
#include <assert.h>
using namespace std;
class Node{
public:
int val = 0;
Node* left = NULL;
Node* right = NULL;
Node(int v):val(v){}
};
void insert(Node** node,int v) {
if (!*node) {*node = new Node(v);return;}
if ((*node)->val > v) insert(&(*node)->left,v);
else insert(&(*node)->right,v);
}
int main() {
Node* root = new Node(2);
root->left = new Node(1);
root->right = new Node(4);
root->left->left = new Node(-1);
insert(&root,0);
insert(&root,3);
cout << root->left->left->right->val << endl;
cout << root->right->left->val << endl;
return 0;
}
对比总结
c++主体解法只有三行 如果当前节点为空,插入到当前节点,当前节点不为空,根据value大小,递归左子树或右子树
JavaScript的思路是判断左孩子和右孩子,一堆if else 很丑
究其原因: JavaScript没有指针,其他语言也一样,没有指针的语言,比如java
参考:算法新解
BST 插入节点传新版本(原痛恨JavaScript每一天 __ 没有指针)的更多相关文章
- javascript数据结构与算法--二叉树(插入节点、生成二叉树)
javascript数据结构与算法-- 插入节点.生成二叉树 二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * ...
- javascript之DOM编程设置节点插入节点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript插入节点小结
JS原生API插入节点的方式大致有innerHTML.outerHTML.appendChild.insertBefore.insertAdjacentHTML.applyElement这6种. 这里 ...
- JS(JavaScript)插入节点的方法appendChild与insertBefore
首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...
- JQuery_DOM 节点操作之创建节点、插入节点
一.创建节点 为了使页面更加智能化,有时我们想动态的在html 结构页面添加一个元素标签,那么在插入之前首先要做的动作就是:创建节点 <script type="text/javasc ...
- Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作
一.创建节点 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div> ...
- appendChild()插入节点需注意的问题
第一点:首先appendChild插入节点时返回的值是插入的节点本身,另外必须要找到所要插入的父节点: var returnNode = parentNode.appendChild(childNod ...
- jQuery节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作
一.创建节点 1 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div& ...
- jQuery插入节点(移动节点)
jQuery插入节点(移动节点) <%@ page language="java" import="java.util.*" pageEncoding=& ...
- dom4j 间隔插入节点 处理复杂的xml文档
前几周跟着老师做了一个小项目,个人主要负责xml文档处理,处理过程还是比较复杂的.此外这篇文章并不是讲基本的dom4j读写xml文档, 所以阅读此文的前提是你已经有了dom4j或jdom等处理xml文 ...
随机推荐
- C语言指针重点
指针 指针与一维数组 万能公式 p[i] = *(p+i) = (i+p) = i[p] &p[i] == &((p+i))== p+i 指针与二维数组 二维数组万能公式: ((p+i ...
- C#使用附加到进程调试
微软官网的调试进程介绍 首先运行bin下的可执行文件,然后打开源代码,选择调试--->附加到进程.
- gin领域层:用户实体编写和值对象(初步)
1.用户实体和值对象 2. 要做的事 3.常见的四层模型 4.Domin层 5.值对象
- 【Java集合框架001】为什么重写equals就要重写hashcode?
一.前言 如果面试官问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法? 遇到这样的问题,应该怎样回答呢?其实,equals和hashCode都 ...
- 读Bilgin Ibryam 新作 《Dapr 是一种10倍数 平台》
Bilgin Ibryam 最近加入了开发者软件初创公司Diagrid Inc,他是Apache Software Foundation 的 committer 和成员.他也是一个开源的布道师,并且是 ...
- C温故补缺(三):存储类声明符(auto,register,extern,static)
auto,register,extern,static 四个存储类声明符,用于定义变量/函数的作用域和声明周期 ① auto:自动变量,即普通变量,在平时定义变量时会自动赋予其auto类型 被auto ...
- npm 依赖下载报错:主机名/IP与证书的altname不匹配
npm 依赖下载报错:主机名/IP与证书的altname不匹配: //取消ssl验证 npm set strict-ssl false npm config set registry http://r ...
- linux常用指令记录
给目标文件夹执行权限:chmod -R 777 html du -sh . [对当前目录下所有的目录和文件的大小进行汇总,-s表示汇总,-h表示以KB, MB, GB, TB格式进行人性化显示]du ...
- 图书管理系统、聚合函数、分组查询、F与Q查询
目录 图书管理系统 1.表设计 2.首页搭建.展示 书籍的添加 书籍编辑 书籍删除 聚合函数 Max Min Sum Count Avg 分组查询 按照表分组 按照字段分组 F与Q查询 F查询 Q查询 ...
- js将时间戳转成时间格式
let start_time = 1653007401082, date = new Date(+start_time), Y = date.getFullYear() + '-', M = (dat ...