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. 用map来统计数组中各个字符串的数量

    1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...

  2. git ignore忽略规则

    目录 Git 忽略文件提交的方法 Git 忽略规则 Git 忽略规则优先级 Git 忽略规则匹配语法 常用匹配示例 多级目录忽略规则设置 .gitignore规则不生效 参考文章 Git 忽略文件提交 ...

  3. CC1,3,6回顾

    前言 前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋,解决一些细节问题. CC1 由于CC1要介绍CC链的几个关键 ...

  4. 嵌入式-c语言基础:冒泡排序实现从大到小排列

    #include<stdio.h> int main() { /*冒泡排序:从大到小*/ /*i=0 第1轮(i+1):需要比较9次(sizeArr-i-1)*/ /*i=1 第2轮(i+ ...

  5. JUnit 5 单元测试教程

    点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 在软件开发过程中,我们通常都需要测试 ...

  6. Kubernetes 1.25.4数据平面自带nginx负载均衡实现高可用

    1.环境准备 要点: 1.使用一个FQDN统一作为API Server的接入点: 2.加入集群之前,每个节点都将该FQDN解析至第一个Master: 3.加入集群之后,每个Master节点将该FQDN ...

  7. 【每日一题】【回溯】2021年12月29日-93. 复原 IP 地址

    有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" 和 "192.1 ...

  8. 【Spark】Day02:Spark-Core:RDD概述、RDD编程(转换算子、Action)、序列化、依赖关系、持久化、数据读取保存、累加器、广播变量、top10、转化率

    总结:https://www.cnblogs.com/qingyunzong/p/8899715.html 一.RDD概述 1.引入:IO流 按行.按字节.字节缓冲 调用read方法读取流,均为惰性加 ...

  9. python重要内置模块

    目录 包的概念 包的具体使用 编程思想的转变 常用内置模块之collections模块 (收集) 常用内置模块之time模块 (时间) 常用内置模块之random模块 (随机) os模块 sys模块 ...

  10. 网络基础与osi七层与TCP/IP协议

     一 什么是网络 网络:计算机网络是一组计算机或网络设备通过有形 的线缆或无形的媒介如无线,连接起来,按照一定的 规则,进行通信的集合. 通信,是指人与人.人与物.物与物之间通过某种媒 介和行为进行的 ...