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 发布文章使用:只允许注册用户才可以访问!
tree traversal的更多相关文章
- LeetCode: Binary Tree Traversal
LeetCode: Binary Tree Traversal 题目:树的先序和后序. 后序地址:https://oj.leetcode.com/problems/binary-tree-postor ...
- [LeetCode] 106. Construct Binary Tree from Postorder and Inorder Traversal_Medium tag: Tree Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- Hierarchical Tree Traversal in Graphics Pipeline Stages
BACKGROUND Many algorithms on a graphics processing unit (GPU) may benefit from doing a query in a h ...
- Algorithm | Tree traversal
There are three types of depth-first traversal: pre-order,in-order, and post-order. For a binary tre ...
- Binary Tree Traversal
1.Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' values. For ex ...
- [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal_Medium tag: Tree Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- 【Leetcode】Binary Tree Traversal
把三个二叉树遍历的题放在一起了. 递归写法太简单,就不再实现了,每题实现了两种非递归算法. 一种是利用栈,时间和空间复杂度都是O(n). 另一种是借助线索二叉树,也叫Morris遍历,充分利用树中节点 ...
- Binary Tree Traversal 二叉树的前中后序遍历
[抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
- 二叉树遍历(Binary Tree Traversal)
二叉树的递归遍历比较简单,这里说一下非递归遍历,以中序遍历为例子. 非递归遍历主要用到栈来协助进行.对于一个二叉树,首先根节点入栈,如果有左儿子,则继续入栈,重复直到最左边的儿子,这时候此节点值为要遍 ...
随机推荐
- Page (computer memory) Memory segmentation Page table 虚拟地址到物理地址的转换
A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described ...
- 【Python网络编程】epoll用法
epoll发展进程 此处添加一下select.poll历程及其优缺点 原理 使用步骤 Create an epoll object--创建1个epoll对象 Tell the epoll object ...
- py, pyc, pyw, pyo, pyd Compiled Python File (.pyc) 和Java或.NET相比,Python的Virtual Machine距离真实机器的距离更远
https://my.oschina.net/renwofei423/blog/17404 1. PyCodeObject与Pyc文件 通常认为,Python是一种解释性的语言,但是这种说法 ...
- Python基础(列表中变量与内存关系)
在Python中,copy的是内存地址,引用的是列表的引用地址,列表里存的是各个元素的地址 例如: name = [1,2,3,4,['xfxing','summer',6]] n2 = name.c ...
- 挖掘隐藏在源码中的Vue技巧!
前言 最近关于Vue的技巧文章大热,我自己也写过一篇(vue开发中的"骚操作"),但这篇文章的技巧是能在Vue的文档中找到蛛丝马迹的,而有些文章说的技巧在Vue文档中根本找不到踪迹 ...
- 圣诞快乐!OIer挂分小技巧
OIer常犯错误 自己的错误 循环里套return 线段树求和 int 定义,下传 int 定义 cmp<,>号分不清 主观行为举动错误 踢电源线,注意安全(_Destiny) TLE 大 ...
- 反弹SHELL介绍及原理
如果我们需要到服务器上执行 Shell 命令,但是因为防火墙等原因,无法由客户端主动发起连接的情况,就可以使用反弹 Shell 来满足登陆和操作的需求. 什么是反弹Shell 正常情况下,我们登陆服务 ...
- 内网渗透之信息收集-linux
linux 系统信息 grep MemTotal /proc/meminfo #查看系统内存总量 cat /etc/issue #查看系统名称 ...
- Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源,BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 各种后台管理系统
Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 家庭理财系统 各种后 ...
- Linux 使用Vmware克隆,修改克隆机器内容
在Vmware中搭建好一台虚拟机,拍照快照,然后克隆其他集群进行练习,克隆后的机器都需要修改的内容有如下几点: 1:各机器之间,在网络上能够互相ping通 每台机器的IP地址必须是唯一的. 进入 ca ...