【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)
最近小菜鸟西瓜莹看到了一道面试题:
给定二叉树,按层打印。例如1的子节点是2、3, 2的子节点是3、4, 5的子节点是6,7.
需要建立如图二叉树:

但是西瓜莹找到的相关代码都是用js构建最优二叉树,假如,依次向二叉树中添加4,2,6,1,3,5,7最优二叉树如图:

比根节点小的节点总是放在根节点的左节点上,比根节点大的节点总是放在根节点的右节点上。
假如想依次向二叉树添加1,2,3,4,5,6,7 二叉树又是如何呢?

后一个数据总是比前一个数据大,那么就会一直在根节点的右节点上。
构建最优二叉树的核心就是添加节点的函数,记录当前节点,如果新数据比当前节点小,则让新数据成为左节点。否则成为右节点。
代码如下:
function addNode(ele){
var n = new Node(ele, null, null);
var Que = [];
if(this.root == null)
{
this.root = n;
}
else {
var curr = this.root;
var parent;
while(true)
{
parent = curr;
if(ele<curr.element)
{
curr = curr.left;
if( curr == null)
{
parent.left = n;
break;
}
}
else{
curr = curr.right;
if(curr == null)
{
parent.right = n;
break;
}
}
}
}
}
}
可是目的并不是创建最优二叉树,而是创建1,2,3,4,5,6,7这样的二叉树,那么如何实现呢?
思路:用一个队列来存储节点,将根节点放入队列中,如果根节点既有左节点又有右节点,将左右节点放入队列,如果没有左节点,将新数据放在左节点上,如果没有右节点,就将新数据放在右节点上。
代码:
function addNode(ele){
var n = new Node(ele, null, null);
var Que = [];
if(this.root == null)
{
this.root = n;
}
else {
var curr = this.root;
Que.push(curr);
}
while(Que.length>0)
{
curr = Que.shift();
if(curr.left != null && curr.right != null)
{
Que.push(curr.left);
Que.push(curr.right);
}
else if(curr.left == null )
{
curr.left = n;
break;
}
else if(curr.right == null)
{
curr.right = n;
break;
}
}
}
二叉树的遍历
层次遍历也采用队列思想:
function showLevel(node)
{
var queue = [];
var curr;
if(this.root != null)
{
queue.push(this.root)
}
while(queue.length>0)
{
curr = queue.shift();
console.info(curr.element)
if(curr.left != null && curr.right != null)
{
queue.push(curr.left);
queue.push(curr.right);
}
else if(curr.left == null )
{
continue;
}
else if(curr.right == null)
{
queue.push(curr.left);
continue;
}
}
}
执行结果:

先序遍历:
function showTree(node){
if(!(node == null))
{
node.show();
showTree(node.left);
showTree(node.right);
}
}
运行结果:

完整代码:
function Node(ele, left, right){
this.element = ele;
this.left = left;
this.right = right;
this.show = show;
}
function show(){
console.log(this.element);
}
function BinaryTree(){
this.root = null;
this.addNode = addNode;
this.showTree = showTree;
this.showLevel = showLevel;
}
function addNode(ele){
var n = new Node(ele, null, null);
var Que = [];
if(this.root == null)
{
this.root = n;
}
else {
var curr = this.root;
Que.push(curr);
}
while(Que.length>0)
{
curr = Que.shift();
if(curr.left != null && curr.right != null)
{
Que.push(curr.left);
Que.push(curr.right);
}
else if(curr.left == null )
{
curr.left = n;
break;
}
else if(curr.right == null)
{
curr.right = n;
break;
}
}
}
function showTree(node){
if(!(node == null))
{
node.show();
showTree(node.left);
showTree(node.right);
}
}
function showLevel(node)
{
var queue = [];
var curr;
if(this.root != null)
{
queue.push(this.root)
}
while(queue.length>0)
{
curr = queue.shift();
console.info(curr.element)
if(curr.left != null && curr.right != null)
{
queue.push(curr.left);
queue.push(curr.right);
}
else if(curr.left == null )
{
continue;
}
else if(curr.right == null)
{
queue.push(curr.left);
continue;
}
}
}
var Tree = new BinaryTree();
Tree.addNode(1)
Tree.addNode(2)
Tree.addNode(3)
Tree.addNode(4)
Tree.addNode(5)
Tree.addNode(6)
Tree.addNode(7)
showTree(Tree.root)
Tree.showLevel(Tree.root)
这样,我们就构建了一个二叉树:

【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)的更多相关文章
- Data Structure 之 最优二叉树
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. ...
- 树和二叉树->最优二叉树
文字描述 结点的路径长度 从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度. 树的路径长度 从树根到每一个结点的路径长度之和叫树的路径长度. 结点的带权路径长 ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- JS数据结构第五篇 --- 二叉树和二叉查找树
一.二叉树的基本概念 从逻辑结构角度来看,前面说的链表.栈.队列都是线性结构:而今天要了解的“二叉树”属于树形结构. 1.1 多叉树的基本概念,以上图中“多叉树”为例说明 节点:多叉树中的每一个点都叫 ...
- 数据结构之Huffman树与最优二叉树
最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式 ...
- JS数据结构第三篇---双向链表和循环链表之约瑟夫问题
一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...
- JS数据结构之 Map
JS数据结构之 Map Map介绍 Map(映射)是ES6引入的一种数据结构.这是一种存储键值对列表很方便的方法,类似于其他编程语言的哈希表. HashMap(哈希表),也叫做散列表.是根据关键码值 ...
- js对select动态添加和删除OPTION
<select id="ddlResourceType" onchange="getvalue(this)"> </select> 动态 ...
- JS对select动态添加options操作[IE&FireFox兼容]
<select id="ddlResourceType" onchange="getvalue(this)"> </select> 动态 ...
随机推荐
- JS传值和传引用
之前看<javascript高级程序设计>时就遇到过一个问题,就是函数传参的问题,书上说是按值传递,而非按引用传递.很多人都会认为js里面有两种传值方式,一种是复制,另一种是数组.对象等按 ...
- 【整理】图解隐马尔可夫模型(HMM)
写在前面 最近在写论文过程中,研究了一些关于概率统计的算法,也从网上收集了不少资料,在此整理一下与各位朋友分享. 隐马尔可夫模型,简称HMM(Hidden Markov Model), 是一种基于概率 ...
- [HDU1232] 畅通工程 (并查集 or 连通分量)
Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的 ...
- 解决VS2015 VBCSCompiler.exe 占用CPU100%的问题
使用VS2015重复编译运行会发现系统运行缓慢甚至卡死,打开windows任务管理器可以发现CPU已经飙到了100%, VBCSCompiler.exe进程出现多个实例并且占用了大量CPU. 解决方案 ...
- 使用es6特性封装async-mysql
node.js的mysql模块本身没有提供返回promise的函数,即是说都是用的回调函数,那么对于我们使用async函数是很不方便的一件事.node.js有一个mysql封装库叫mysql-prom ...
- 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字
2272: [Usaco2011 Feb]Cowlphabet 奶牛文字 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 138 Solved: 97 ...
- idiom - Initialization-on-demand holder 延迟加载的单例模式
参考:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom idiom - 一个线程安全的.无需synchroniza ...
- PowerDesigner建模应用(一)逆向工程,配置数据源并导出PDM文件
物理数据模型(Physical Data Model)PDM,提供了系统初始设计所需要的基础元素,以及相关元素之间的关系:数据库的物理设计阶段必须在此基础上进行详细的后台设计,包括数据库的存储过程.操 ...
- 关于PHP单双引号解析变量的问题
双引号可以解析变量,单引号不行 $qweqwe = 123; echo "$qweqwe"; 输出123 echo '$qweqqwe'; 输出$qweqwe
- .net core 部署 centos7 初试
最近抽时间搞搞.net core,这方面已经有很多先驱人物贡献了好多文章了,今天沿着前辈们走的坑自己再淌一下...... 注意开头说的使用centos7,我电脑之前全是6.几的版本,然后就一头雾水的搞 ...