层次遍历二叉树算法完整代码,代码实现二叉树的三种遍历
本文为大家带来了关于javascript的相关知识,主要介绍了JavaScript二叉树的细节和各种遍历算法。文章围绕主题,详细介绍了细节,具有一定的参考价值。有需要的朋友可以参考一下。希望对你有帮助。
【相关推荐:javascript视频教程,web前端】
什么是二叉树
二叉树是每个节点最多只能有两个子节点的树,如下图所示:
一个二叉树具有以下几个特质:
第一层只有2 (I-1)个节点;如果这个二叉树的深度是k,那么二叉树最多有2个k-1节点;在非空二叉树中,如果用n0表示叶节点的个数,n2是度为2的非叶节点的个数,那么两者都满足关系n0=N2 ^ 1。
满二叉树
如果在二叉树中,除了叶子节点,其余的节点的每个度都是2,则说明该二叉树是一个满二叉树,
如下图所示:
满二叉树除了满足普通二叉树特质,还具有如下几个特质:
完整二叉树的第n层有2 (n-1)个节点;深度为k的全二叉树必须有2个k-1节点,叶节点数为2 (k-1)。具有n个节点的完整二叉树的深度是log _ 2(n-1)。
完全二叉树
如果一个二叉树去掉最后一次层是满二叉树,且最后一次的节点是依次从左到右分布,那么这个二叉树就是完全二叉树,
如下图所示:
二叉树的存储
二叉树常用的存储方式有两种,一种是使用数组存储,另一种是使用链表。
数组存储
使用数组存储二叉树,如果遇到完全二叉树,存储顺序从上到下,从左到右,如下图所示:
如果是一个非完全二叉树,如下图所示:
需要先将其转换为完全二叉树,然后在进行存储,如下图所示:
可以明显看到储物空间的浪费。
链表存储
使用链表存储通常将二叉树中的分为3个部分,如下图:
这三个部分依次是左子树的引用,该节点包含的数据,右子树的引用,存储方式如下图所示:
与二叉树相关的算法
以下算法中遍历用到的树如下:
//tree.js
常数bt={
瓦尔: A ,
左:{
瓦尔: B ,
左:{ val: D ,左:null,右:null },
右:{ val: E ,左:null,右:null },
},
右:{
瓦尔: C ,
左:{
瓦尔: F ,
左:{ val: H ,左:null,右:null },
右:{ val: I ,左:null,右:null },
},
右:{ val: G ,左:null,右:null },
},
}
module . exports=Bt
深度优先遍历
二叉树的深度优先遍历与树的深度优先遍历思路一致,思路如下:
访问根节点;对根节点的左访问和对根节点的右访问重复第二和第三步骤实现代码如下:。
常数bt={
瓦尔: A ,
左:{
瓦尔: B ,
左:{ val: D ,左:null,右:null },
右:{ val: E ,左:null,右:null },
},
右:{
瓦尔: C ,
左:{
瓦尔: F ,
左:{ val: H ,左:null,右:null },
右:{ val: I ,左:null,右:null },
},
右:{ val: G ,左:null,右:null },
},
}
函数dfs(根){
如果(!根)返回
console.log(root.val)
左dfs(root.left)
root.right dfs(root.right)
}
dfs(英国电信)
/* *结果
I G
*/
广度优先遍历
实现思路如下:
创建队列,将根节点入队,将队列头出队,并访问队列头的左侧和右侧。重复步骤2和3,直到队列为空实现代码如下:。
函数bfs(根){
如果(!根)返回
常量队列=[根]
while (queue.length) {
const node=queue.shift()
console.log(node.val)
node.left queue.push(node.left)
node . right queue . push(node . right)
}
}
bfs(bt)
/* *结果
你好
*/
先序遍历
二叉树的先序遍历实现思想如下:
访问根节点;首先遍历当前节点的左子树;首先遍历当前节点的右边子树;如下图所示:
递归方式实现如下:
const bt=require(。/tree’)
函数预排序(根){
如果(!根)返回
console.log(root.val)
前序(root.left)
前序(root.right)
}
预购
/* *结果
I G
*/迭代方式实现如下:
//非递归版本
函数预排序(根){
如果(!根)返回
//定义用于存储数据的堆栈
常量堆栈=[根]
while (stack.length) {
const node=stack.pop()
console.log(node.val)
/*因为堆栈具有先进后出的特性,所以需要先进入右边的子树,保证左边的子树先出*/
node . right stack . push(node . right)
node.left stack.push(node.left)
}
}
预购
/* *结果
I G
*/
中序遍历
二叉树的中序遍历实现思想如下:
按中间顺序遍历当前节点的左子树;访问根节点;按中间顺序遍历当前节点的右子树;如下图所示:
递归方式实现如下:
const bt=require(。/tree’)
//递归版本
函数顺序(根){
如果(!根)返回
顺序(左根)
console.log(root.val)
inorder(root.right)
}
订单(英国电信)
/** 结果
英国国际金融公司
*/迭代方式实现如下:
//非递归版
函数顺序(根){
如果(!根)返回
常量堆栈=[]
//定义一个指针
设p=根
//如果栈中有数据或者p不是空,则继续遍历
while (stack.length p) {
//如果p存在则一致将p入栈并移动指针
while (p) {
//将p入栈,并以移动指针
堆栈。推送(p)
左侧
}
const node=stack.pop()
console.log(node.val)
p=节点。右
}
}
订单(英国电信)
/** 结果
英国国际金融公司
*/
后序遍历
二叉树的后序遍历实现思想如下:
对当前节点的左子树进行后序遍历;对当前节点的右子树进行后序遍历;访问根节点;如下图所示:
递归方式实现如下:
const bt=require( ./tree’)
//递归版
函数后序(根){
如果(!根)返回
后序(左根)
后序(root.right)
console.log(root.val)
}
邮购
/** 结果
英国国际航空公司
*/迭代方式实现如下:
//非递归版
函数后序(根){
如果(!根)返回
const outputStack=[]
常量堆栈=[根]
while (stack.length) {
const node=stack.pop()
输出堆栈。推送(节点)
//这里先入左边的需要保证左边的后出,在堆中后出,就是在输出堆栈栈中先出
node.left stack.push(node.left)
节点。右栈。推(节点。右)
}
while (outputStack.length) {
const node=outputStack.pop()
console.log(node.val)
}
}
邮购
/** 结果
英国国际航空公司
*/【相关推荐:javascript视频教程、网络前端】以上就是详细介绍Java脚本语言二叉树及各种遍历算法的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。