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每一天 __ 没有指针)的更多相关文章

  1. javascript数据结构与算法--二叉树(插入节点、生成二叉树)

    javascript数据结构与算法-- 插入节点.生成二叉树 二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * ...

  2. javascript之DOM编程设置节点插入节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JavaScript插入节点小结

    JS原生API插入节点的方式大致有innerHTML.outerHTML.appendChild.insertBefore.insertAdjacentHTML.applyElement这6种. 这里 ...

  4. JS(JavaScript)插入节点的方法appendChild与insertBefore

    首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...

  5. JQuery_DOM 节点操作之创建节点、插入节点

    一.创建节点 为了使页面更加智能化,有时我们想动态的在html 结构页面添加一个元素标签,那么在插入之前首先要做的动作就是:创建节点 <script type="text/javasc ...

  6. Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作

    一.创建节点 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div> ...

  7. appendChild()插入节点需注意的问题

    第一点:首先appendChild插入节点时返回的值是插入的节点本身,另外必须要找到所要插入的父节点: var returnNode = parentNode.appendChild(childNod ...

  8. jQuery节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作

    一.创建节点 1 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div& ...

  9. jQuery插入节点(移动节点)

    jQuery插入节点(移动节点) <%@ page language="java" import="java.util.*" pageEncoding=& ...

  10. dom4j 间隔插入节点 处理复杂的xml文档

    前几周跟着老师做了一个小项目,个人主要负责xml文档处理,处理过程还是比较复杂的.此外这篇文章并不是讲基本的dom4j读写xml文档, 所以阅读此文的前提是你已经有了dom4j或jdom等处理xml文 ...

随机推荐

  1. C语言嵌套for循环实现冒泡排序

    使用嵌套for循环实现冒泡排序的一个函数. #include<stdio.h> /** * 介绍: * 使用嵌套for循环实现冒泡排序,由小到大(上小下大). * 参数: * sum[]: ...

  2. 2022春每日一题:Day 10

    题目:CF1110E Magic Stones 每次操作 c[i]变成c[i-1]+c[i+1]-c[i],那么显然,c[1]和c[n]是不会改变的,因此只要c[1]和t[1],c[n]和t[n]不相 ...

  3. 交叉编译:zlib,openSSL,openSSH

    1. 编译zlib wget https://www.zlib.net/zlib-1.2.12.tar.gz # 编译命令 export CC=arm-fullhanv3-linux-uclibcgn ...

  4. c#对接每人计平台获取数据

    使用c#对接到晓舟科技的客流统计设备.那么需要先注册一个平台的账号 地址:http://mrd.meirenji.cn/login;JSESSIONID=323cbd18-29ed-4232-8c04 ...

  5. 进军东南亚市场,腾讯云数据库 TDSQL 助力印尼 BNC 银行数字化转型

    腾讯云数据库在助力金融核心系统分布式替换上,已经辐射到了东南亚市场. 东南亚最大的银行之一印尼BNC银行(Bank Neo Commerce)已正式完成新核心分布式迁移,使用腾讯云数据库TDSQL后, ...

  6. Oracle 插入时间戳id函数func_getnewid()

    在Oracle数据库中出入以时间戳为id的最简单方法运用func_getnewid()函数: select func_getnewid(30) from dual; id长度可调

  7. Spring Security(8)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前虽然实现了角色和权限之间的简单配对,但是如果每一个角色都要重新来过一次,就有点呆板了.如果能够配置一个「角色模板」,再通过这个模板来配置其他 ...

  8. 【Java EE】Day13 Web概念回顾、Tomcat、Servlet

    一.Web相关概念的回顾 1.软件架构 C/S B/S 2.资源分类 静态资源 所有用户访问得到相同结果 三剑客 浏览器通过静态解析引擎将从服务器接收到的静态资源显示到页面上 动态资源 不同用户访问得 ...

  9. 深入理解Whitelabel Error Page底层源码

    深入理解Whitelabel Error Page底层源码 (一)服务器请求处理错误则转发请求url StandardHostValve的invoke()方法将根据请求的url选择正确的Context ...

  10. 从Spring中学到的【2】--容器类

    容器类 我们在实际编码中,常常会遇到各种容器类,他们有时叫做POJO,有时又叫做DTO,VO, DO等,这些类只具有容器的作用,具有完全的get,set方法,作为信息载体,作数据传输用. 其实,很多地 ...