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)
二叉树的递归遍历比较简单,这里说一下非递归遍历,以中序遍历为例子. 非递归遍历主要用到栈来协助进行.对于一个二叉树,首先根节点入栈,如果有左儿子,则继续入栈,重复直到最左边的儿子,这时候此节点值为要遍 ...
随机推荐
- Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析
Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...
- UML 博客学习 后续继续完善
http://blog.csdn.net/monkey_d_meng/article/details/6005764 http://blog.csdn.net/badobad/article/det ...
- 洛谷P3501
Description 对于一个 \(0/1\) 串,如果取反后再将整个串反过来和原串一样,就称作「反对称」字符串 给出一个长度为 \(n\) 的 \(0/1\) 串,求它有多少个反对称子串 Solu ...
- 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)
传送门 B-小宝的幸运数组 题目描述 对于小宝来说,如果一个数组的总和能够整除他的幸运数字k,就是他的幸运数组,而其他数组小宝都很讨厌.现在有一个长度为n的数组,小宝想知道这个数组的子数组中,最长的幸 ...
- SpringMVC听课笔记(SpringMVC 表单标签 & 处理静态资源)
1.springmvc表单标签,可以快速开发,表单回显,但是感触不深 2.静态资源的获取,主要是要配置这个
- Windows操作Redis及Redis命令
Windows操作Redis及Redis命令 一.Windows下操作Redis 设置密码 打开redis服务 Windows 下的redis命令行 二.redis常用命令大全 key String ...
- Cobbler 自动化部署 (转载)
https://www.cnblogs.com/linuxliu/p/7668048.html root默认密码为 123456 (建议修改) ks文件 #platform=x86, AMD64, o ...
- Java POI 导出EXCEL经典实现
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...
- zabbix添加持续告警
- Pytest(17)运行未提交的git(pytest-picked)
前言 我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例.pytest-picked 插件可以 ...