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的更多相关文章

  1. LeetCode: Binary Tree Traversal

    LeetCode: Binary Tree Traversal 题目:树的先序和后序. 后序地址:https://oj.leetcode.com/problems/binary-tree-postor ...

  2. [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 ...

  3. 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 ...

  4. Algorithm | Tree traversal

    There are three types of depth-first traversal: pre-order,in-order, and post-order. For a binary tre ...

  5. Binary Tree Traversal

    1.Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' values. For ex ...

  6. [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 ...

  7. 【Leetcode】Binary Tree Traversal

    把三个二叉树遍历的题放在一起了. 递归写法太简单,就不再实现了,每题实现了两种非递归算法. 一种是利用栈,时间和空间复杂度都是O(n). 另一种是借助线索二叉树,也叫Morris遍历,充分利用树中节点 ...

  8. Binary Tree Traversal 二叉树的前中后序遍历

    [抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...

  9. 二叉树遍历(Binary Tree Traversal)

    二叉树的递归遍历比较简单,这里说一下非递归遍历,以中序遍历为例子. 非递归遍历主要用到栈来协助进行.对于一个二叉树,首先根节点入栈,如果有左儿子,则继续入栈,重复直到最左边的儿子,这时候此节点值为要遍 ...

随机推荐

  1. Docker 中的网络功能介绍 外部访问容器 容器互联 配置 DNS

    Docker 中的网络功能介绍 | Docker 从入门到实践 https://vuepress.mirror.docker-practice.com/network/ Docker 允许通过外部访问 ...

  2. go 语言开发中 GOPATH问题 与 go语言linux 开发环境 教程

    https://github.com/rubyhan1314/Golang-100-Days/blob/master/Day01-15(Go%E8%AF%AD%E8%A8%80%E5%9F%BA%E7 ...

  3. libevent源码学习之event

    timer event libevent添加一个间隔1s持续触发的定时器如下: struct event_base *base = event_base_new(); struct event *ti ...

  4. null调整为not null default xxx,不得不注意的坑

    最近碰到一个case,值得分享一下. 现象 一个DDL,将列的属性从null调整为not null default xxx, alter table slowtech.t1 modify name v ...

  5. JavaScript代码是怎么执行的?

    前言 众所周知,JavaScript是单线程语言.所以JavaScript是按顺序执行的! 先编译再执行 变量提升 请看下面的例子: console.log(cat) catName("Ch ...

  6. 算法总结篇---字典树(Trie)

    目录 写在前面 具体实现 引例: 引例代码: 例题 Phone List Solution: The XOR Largest Pair Solution L语言 Solution: 写在前面 字典树是 ...

  7. FLOYD判圈

    转载一篇博客:http://blog.csdn.net/javasus/article/details/50015687 Floyd判圈算法(Floyd Cycle Detection Algorit ...

  8. 不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)

    前言 公司刚开始建设安全管理时,都是从一片混沌开始的,资源总是不够的,我们每个做安全的人员,又要会渗透,又要抓制度,还得管理各种漏洞.在管理楼栋是,我相信大家都遇到过以下几个问题: 漏洞提交太多,自己 ...

  9. Struts 2学习(二)

    文章目录 @[toc] #动态结果 配置时不知道执行后的结果是哪一个,运行时才知道哪个结果作为视图显示给用户. #全局结果 全局就结果可满足一个包中多个Action共享一个结果. 全局结果位于pack ...

  10. java调用shell脚本执行操作

    //定时清空 日志 String shellString = "sh /home/jyapp/delete_log.sh"; Process process = Runtime.g ...