前言:
二叉树的特点(例图只是二叉树的一种情况,不要尝试用例图推理以下结论)
最下面一层的节点称为叶子节点,他们没有子节点;
左子节点的值 < 父节点的值 <= 右节点的值
1 节点的javascript实现
// 节点对象
function Node(data, left, right) {
this.data = data; // 节点值
this.left = left; // 当前节点的左子节点
this.right = right; // 当前节点的右子节点
this.show = show; // 辅助function
}
function show() {
return this.data;
}
感受下上面实现节点的代码,感觉和链表有点相似不是吗,存着当前值,又存着下个节点(左、右子节点)的引用,下面是一张伪代码的草图:
2 二叉树的实现
实现二叉树,当然就是要插入节点构成二叉树,先看看实现二叉树的js代码
function BST() {
this.root = null;
this.insert = insert;
}
function insert(data) {
var n = new Node(data, null, null);
if (this.root == null) {
this.root = n;
}
else {
var current = this.root;
var parent;
while (true) {
parent = current;
if (data < current.data) {
current = current.left;
if (current == null) {
parent.left = n;
break;
}
}
else {
current = current.right;
if (current == null) {
parent.right = n;
break;
}
}
}
}
}
然后是看一下伪代码:
function BST() {
this.root = null; // 根节点
this.insert = insert;
}
function insert(data) {
// 初始化一个节点,为什么要将左右子节点的引用初始化为空呢,因为可能是叶子节点,加入他有子节点,会在下面的代码添加
var n = new Node(data, null, null);
if (该二叉树是否为空,是空则根节点为空,因此可以用根节点判断二叉树是否为空) {
// 将当前节点存为根节点
this.root = n;
}
else {
// 来到这里就表示,该二叉树不为空,这里关键的是两句代码:
// 0.while (true);
// 1.parent = current;
// 2.current = current.left;/current = current.right;
// 3.break;
var current = this.root;
var parent;
while (true) {
parent = current; // 获得父节点,第一次循环,那么父节点就是根节点
if (data < current.data) { // 当前节点值小于父节点的值就是存左边,记得二叉树的特点吧,如果真是小于父节点,那么就说明该节点属于,该父节点的左子树。
current = current.left;
if (current == null) {
parent.left = n;
break;
}
// 其实上面这样写不好理解,可以等价于下面的代码:
// start
if(current.left == null){ // 若果左节点空,那么这个空的节点就是我们要插入的位置
current.left = n;
break;
}else{
// 不空则继续往下一层找空节点(插入的位置)
current = current.left;
}
// end
}
else {
// 右节点的逻辑代码个左节点的一样的
current = current.right;
if (current == null) {
parent.right = n;
break;
}
}
}
}
}
下面是一个更好理解的插入函数
function insert(data) {
var n = new Node(data, null, null);
if (this.root == null) {
this.root = n;
}
else {
var current = this.root;
// start change
while (true) {
if (data < current.data) {
if (current.left == null) {
current.left = n;
break;
}else{
current = current.left;
}
}else {
if (current.right == null) {
current.right = n;
break;
}else{
current = current.right;
}
}
}
}
}
小结:
二叉树的实现的三个部件
Node对象
function Node(data, left, right) { ... }
BST对象
function BST() { ... }
插入节点函数
function insert(data) { ... }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# javascript实现二叉树
# javascript
# 二叉树
# js二叉树的实现
# JS中的二叉树遍历详解
# JS实现的二叉树算法完整实例
# JavaScript数据结构和算法之二叉树详解
# JS二叉树的简单实现方法示例
# JavaScript实现二叉树的先序、中序及后序遍历方法详解
# javascript实现二叉树遍历的代码
# JavaScript数据结构之二叉树的删除算法示例
# JavaScript数据结构之二叉树的遍历算法示例
# JavaScript数据结构之二叉树的查找算法示例
# js构建二叉树进行数值数组的去重与优化详解
# 为空
# 子树
# 的是
# 都是
# 是一个
# 都有
# 最多
# 可以用
# 会在
# 他有
# 两句
# 要将
# 看一下
# 往下
# 嘴上
# 下个
# 图中
# 大家多多
# 点吧
相关文章:
香港服务器租用每月最低只需15元?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
行程制作网站有哪些,第三方机票电子行程单怎么开?
学校建站服务器如何选型才能满足性能需求?
如何在新浪SAE免费搭建个人博客?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何通过.red域名打造高辨识度品牌网站?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在IIS中新建站点并配置端口与物理路径?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何用PHP快速搭建CMS系统?
制作网站公司那家好,网络公司是做什么的?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
七夕网站制作视频,七夕大促活动怎么报名?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Python如何创建带属性的XML节点
如何构建满足综合性能需求的优质建站方案?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何用花生壳三步快速搭建专属网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
孙琪峥织梦建站教程如何优化数据库安全?
Android滚轮选择时间控件使用详解
建站VPS能否同时实现高效与安全翻墙?
如何用狗爹虚拟主机快速搭建网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
北京的网站制作公司有哪些,哪个视频网站最好?
如何在万网自助建站中设置域名及备案?
如何通过虚拟主机快速完成网站搭建?
平台云上自主建站:模板化设计与智能工具打造高效网站
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
盐城做公司网站,江苏电子版退休证办理流程?
建站之星代理如何获取技术支持?
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何在Windows虚拟主机上快速搭建网站?
制作电商网页,电商供应链怎么做?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
网站制作价目表怎么做,珍爱网婚介费用多少?
,交易猫的商品怎么发布到网站上去?
如何登录建站主机?访问步骤全解析
实现虚拟支付需哪些建站技术支撑?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
如何在景安服务器上快速搭建个人网站?
北京企业网站设计制作公司,北京铁路集团官方网站?
建站之星如何实现PC+手机+微信网站五合一建站?
如何在云主机快速搭建网站站点?
建站168自助建站系统:快速模板定制与SEO优化指南
如何在IIS管理器中快速创建并配置网站?
定制建站是什么?如何实现个性化需求?
*请认真填写需求信息,我们会在24小时内与您取得联系。