tree traversal
tree traversal
tree 遍历
中序,顺序,左中右
先序,先父节点,中左右
后序,先子节点,左右中
二叉搜索树
"use strict";
/**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2020-06-21
* @modified
*
* @description
* @augments
* @example
* @link
*
*/
const log = console.log;
function BinarySearchTree () {
var root = null;
// 节点,构造函数
function Node (key) {
this.key = key;
this.left = null;
this.right = null;
}
// 闭包,私有方法
function insertNode(root, node) {
if(root.key > node.key) {
// 左子树
if (root.left === null) {
root.left = node;
} else {
insertNode(root.left, node);
}
} else {
// root.key <= node.key
// 右子树
if (root.right === null) {
root.right = node;
} else {
insertNode(root.right, node);
}
}
}
this.insert = function(key) {
var node = new Node(key);
if(!root && root === null) {
root = node;
} else {
insertNode(root, node);
}
}
this.getRoot = function(callback) {
if(root) {
callback(root);
}
}
var traversalNodeKey = function(type = `min`, node, callback) {
if(node !== null) {
switch (type) {
case 'min':
if(node.left) {
traversalNodeKey(type, node.left, callback);
} else {
callback(node.key)
}
break;
case 'max':
if(node.right) {
traversalNodeKey(type, node.right, callback);
} else {
callback(node.key)
}
break;
default:
break;
}
}
}
this.getMin = function(callback) {
if(root) {
traversalNodeKey(`min`, root, callback);
}
}
this.getMax = function(callback) {
if(root) {
traversalNodeKey(`max`, root, callback);
}
}
// 遍历 utils
var traversalNode = function(type = `in`, node, callback) {
if(node !== null) {
switch (type) {
case 'pre':
// 中左右
callback(node.key);
traversalNode(node.left, callback);
traversalNode(node.right, callback);
break;
case 'post':
// 左右中
traversalNode(node.left, callback);
traversalNode(node.right, callback);
callback(node.key);
break;
case 'in':
default:
// 左中右
traversalNode(node.left, callback);
callback(node.key);
traversalNode(node.right, callback);
break;
// default:
// break;
}
}
}
// 中序遍历
this.inOrderTraverse = function(callback) {
if(root) {
inOrderTraverseNode(root, callback);
// traversalNode(`in`, root, callback);
}
}
var inOrderTraverseNode = function(node, callback) {
if(node !== null) {
// 左中右
inOrderTraverseNode(node.left, callback);
callback(node.key);
inOrderTraverseNode(node.right, callback);
}
}
// 先序遍历
this.preOrderTraverse = function(callback) {
if(root) {
preOrderTraverseNode(root, callback);
// traversalNode(`pre`, root, callback);
}
}
var preOrderTraverseNode = function(node, callback) {
if(node !== null) {
// 中左右
callback(node.key);
preOrderTraverseNode(node.left, callback)
preOrderTraverseNode(node.right, callback)
}
}
// 后序遍历
this.postOrderTraverse = function(callback) {
if(root) {
postOrderTraverseNode(root, callback);
// traversalNode(`post`, root, callback);
}
}
var postOrderTraverseNode = function(node, callback) {
if(node !== null) {
// 左右中
postOrderTraverseNode(node.left, callback);
postOrderTraverseNode(node.right, callback);
callback(node.key);
}
}
}
// export default BinarySearchTree;
// export {
// BinarySearchTree,
// };
// test
const bst = new BinarySearchTree();
bst.insert(7)
bst.insert(8)
bst.insert(6)
bst.insert(9)
bst.insert(5)
bst.insert(10)
bst.insert(4)
bst.insert(11)
bst.insert(3)
bst.insert(12)
bst.insert(2)
bst.insert(13)
bst.insert(1)
var arr = [];
function print (key) {
// log(`node.key`, key)
arr.push(key);
if(arr.length > 12) {
log(`arr`, arr)
}
}
// arr = [];
// bst.inOrderTraverse(print);
// arr = [];
// bst.preOrderTraverse(print);
// arr = [];
// bst.postOrderTraverse(print);
// bst.getRoot((root) => log(`root`, root));
// bst.getRoot((root) => log(`root`, JSON.stringify(root)));
// bst.getRoot((root) => log(`root`, JSON.parse(JSON.stringify(root))));
bst.getMin((min) => log(`min node`, min))
bst.getMax((max) => log(`max node`, max))
refs
Binary tree
©xgqfrms 2012-2020
www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/13181546.html
未经授权禁止转载,违者必究!
分类:
算法 / 数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)