【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> 动态 ...
随机推荐
- 快速排序OC、Swift版源码
前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...
- java中map集合的迭代
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...
- 重新认识JavaScript
JavaScrpit在我眼中一直是web前端脚本语言,而这段时间的一些工作,让我对JavaScript有了一个全新的认识. 公司准备启动的一个手游项目,服务器端准备使用网易的开源框架pomelo.po ...
- .NET的SqlHelper应用代码
首先需要引用命名空间 ,同时也需要右击'引用' --> '添加引用' --> '程序集' --> '框架' --> 'System.Configuration',SqlHelp ...
- .NET获取客户端的操作系统、IP地址、浏览器版本
获取客户端的操作系统: #region 获取操作系统版本号 /// <summary> /// 获取操作系统版本号 /// </summary> /// <returns ...
- 深入理解ajax系列第三篇——响应解码
前面的话 我们接收到的响应主体类型可以是多种形式的,包括字符串String.ArrayBuffer对象.二进制Blob对象.JSON对象.javascirpt文件及表示XML文档的Document对象 ...
- python实现视频下载
最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站 ...
- 3892: [Usaco2014 Dec]Marathon
3892: [Usaco2014 Dec]Marathon Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 169 Solved: 100[Submi ...
- 面向对象的全套“企业微信”api接口的代码实现,网上太多“面向过程”微信api接口的代码,这个开源给需要的人用
有段时间没有写文章了. 一直以来,微信的热门是看得到的,很多人都需要与微信的api对接. 今天我这里就分享全套的企业微信api接口的代码. 关于微信api,网上已经有很多实现的了. 但是我今天之所以还 ...
- Asp.Net MVC4中的全局过滤器,
可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码: FilterConfig.RegisterGlobalFilters(GlobalFilters ...