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. AES 密钥与 RSA 密钥的关系

    AES 加密说明 - 支付宝开放平台 https://opendocs.alipay.com/open/common/104567 AES 密钥是对接口请求和响应内容进行加密,密文无法被第三方识别,从 ...

  2. (Sql Server)存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  3. loj10153二叉苹果树

    有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点.这棵树共 N 个节点,标号 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一根树枝的位置.一棵有四根树 ...

  4. C# 实现语音聊天

    一.语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点: (1)时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会 ...

  5. SpringCloud配置中心实战

    SpringCloud配置中心实战 1.统一配置中心(Config) 1.1 Spring项目配置加载顺序 1.2 配置规则详解 1.3 Git仓库配置 1.3.1 使用占位符 1.3.2 模式匹配 ...

  6. Centos7 yum 安装 oracle-rdbms-server-11gR2-pre

    Oracleyum官方网站 http://yum.oracle.com/ 一.下载yum源 根据自己需求下载相应的yum源 http://yum.oracle.com/getting-started. ...

  7. freemarket+itext+springboot将html静态页面渲染后导出为pdf文件

    1.maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf& ...

  8. JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比

    谈垃圾回收器之前,要先讲讲垃圾回收算法,以及JVM对垃圾的认定策略,JVM垃圾回收器是垃圾回收算法的具体实现,了解了前面的前置知识,有利于对垃圾回收器的理解. 什么是垃圾? 垃圾,主要是指堆上的对象, ...

  9. Java开发中POJO和JSON互转时如何忽略隐藏字段

    1. 前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道.通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Ja ...

  10. 用到的API整理

    时间 淘宝 http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp 获取时间戳,调用效果 { "api" ...