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文 ...
随机推荐
- 用map来统计数组中各个字符串的数量
1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...
- Go语言核心36讲51
你好,我是郝林,今天我们继续分享程序性能分析基础的内容. 在上一篇文章中,我们围绕着"怎样让程序对CPU概要信息进行采样"这一问题进行了探讨,今天,我们再来一起看看它的拓展问题. ...
- Spring IOC源码(二):IOC容器之 刷新前的准备
1.源码解析 prepareRefresh()容器刷新refresh()的第一个方法,是容器刷新前的准备工作. 1 // 容器启动的开始时间 毫秒级 2 private long startupDat ...
- Go适合做什么?为何这么多人偏爱Go语言?
Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着 ...
- 多表查询两种方法、可视化软件navicat、python操作mysql、pymysql模块
目录 多表查询的思路 多表查询的两种方法 小知识点补充数说明 可视化软件Navicat 安装教程 数据库常用操作 多表查询练习题 python 操作MySQL pymysql补充说明 Non-grou ...
- Jmeter在结果树中查看响应数据为空
今天遇到了一个比较尴尬的问题,吭哧吭哧了大半天,后来咨询了开发SO的一下解决了. 问题: 在调用接口时取样器结果中显示response code:200, response message:OK,但是 ...
- Salesforce LWC学习(四十) datatable的dynamic action的小坑浅谈
本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentatio ...
- 关于RESTful 的使用(实战)
今天在博客园首页看到一篇关于写 RESTful, 大致就是前端定义的一种规范. 原文如下, https://www.cnblogs.com/zhangmumu/p/11936262.html 看了一圈 ...
- CH9120/CH9121 WCH-ETH透传芯片(持续更新)
网络变压器中心抽头: 如果使用网络变压器,变压器的中心抽头需要看PHY芯片时电流型还是电压型. 如果是电压型,则需要通过一个电容直接接到GND. 如果时电流型的PHY,那么就需要根据PHY芯片来看,从 ...
- [深度学习] Python人脸识别库face_recognition使用教程
Python人脸识别库face_recognition使用教程 face_recognition号称是世界上最简单的开源人脸识别库,可以通过Python或命令行识别和操作人脸.face_recogni ...