数据结构与算法之二叉树 ——in dart
用dart语言实现的二叉树,实现了插入、查找、删除,中序遍历、前序、后序遍历等功能。
class BinaryTree<E extends Comparable> {
Node<E> _root;
int _nodeNumbers;
BinaryTree() : _nodeNumbers = 0;
factory BinaryTree.from(Iterable<E> elements) {
var tree = BinaryTree<E>();
for (var e in elements) tree.insert(e);
return tree;
}
bool get isEmpty => _root == null;
int get nodeNumbers => _nodeNumbers;
void clear() {
_root = null;
_nodeNumbers = 0;
}
bool delete(E value) {
var deleted = find(value);
if (deleted == null) return false;
_delete(deleted);
_nodeNumbers--;
return true;
}
Node<E> find(E value) {
var current = _root;
while (current != null) {
var c = value.compareTo(current.value);
if (c == 0) break;
current = c < 0 ? current.leftChild : current.rightChild;
}
return current;
}
void insert(E value) {
var inserted = Node(value);
if (isEmpty) {
_root = inserted;
} else {
var current = _root;
while (current != null) {
if (value.compareTo(current.value) <= 0) {
if (current.leftChild == null) {
current.leftChild = inserted;
inserted.parent = current;
break;
} else {
current = current.leftChild;
}
} else {
if (current.rightChild == null) {
current.rightChild = inserted;
inserted.parent = current;
break;
} else {
current = current.rightChild;
}
}
}
}
_nodeNumbers++;
}
void traverse(void func(E value), [TraverseOrder order]) {
_traverse(_root, order, func);
}
E get max {
if (isEmpty) throw TreeEmptyException();
var maxNode = _root;
while (maxNode.rightChild != null) maxNode = maxNode.rightChild;
return maxNode.value;
}
E get min {
if (isEmpty) throw TreeEmptyException();
return _minNode(_root).value;
}
Node<E> _minNode(Node<E> root) {
var minNode = root;
while (minNode.leftChild != null) minNode = minNode.leftChild;
return minNode;
}
void _delete(Node<E> deleted) {
var successor = _successor(deleted);
if (successor != null) _delete(successor);
if (deleted == _root) _root = successor;
_replace(deleted, successor);
}
static void _replace<E>(Node<E> deleted, Node<E> successor) {
if (deleted.parent != null) {
if (deleted.parent.leftChild == deleted)
deleted.parent.leftChild = successor;
else
deleted.parent.rightChild = successor;
}
if (successor != null) {
successor.parent = deleted.parent;
successor.leftChild = deleted.leftChild;
successor.rightChild = deleted.rightChild;
if (deleted.leftChild != null) deleted.leftChild.parent = successor;
if (deleted.rightChild != null) deleted.rightChild.parent = successor;
}
}
Node<E> _successor(Node<E> node) =>
node.rightChild != null ? _minNode(node.rightChild) : node.leftChild;
static void _traverse<E>(Node<E> root, TraverseOrder order, void func(E e)) {
if (root == null) return;
switch (order) {
case TraverseOrder.preOrder:
func(root.value);
_traverse(root.leftChild, order, func);
_traverse(root.rightChild, order, func);
break;
case TraverseOrder.postOrder:
_traverse(root.leftChild, order, func);
_traverse(root.rightChild, order, func);
func(root.value);
break;
default:
_traverse(root.leftChild, order, func);
func(root.value);
_traverse(root.rightChild, order, func);
}
}
}
enum TraverseOrder { preOrder, inOrder, postOrder }
class Node<E> {
E value;
Node<E> parent, leftChild, rightChild;
Node(this.value);
}
class TreeEmptyException implements Exception {
const TreeEmptyException();
String toString() => 'TreeEmptyException';
}
数据结构与算法之二叉树 ——in dart的更多相关文章
- 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)
前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...
- Java数据结构和算法(六)--二叉树
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...
- 数据结构和算法 – 9.二叉树和二叉查找树
9.1.树的定义 9.2.二叉树 人们把每个节点最多拥有不超过两个子节点的树定义为二叉树.由于限制子节点的数量为 2,人们可以为插入数据.删除数据.以及在二叉树中查找数据编写有效的程序了. 在 ...
- Java数据结构和算法(七)--AVL树
在上篇博客中,学习了二分搜索树:Java数据结构和算法(六)--二叉树,但是二分搜索树本身存在一个问题: 如果现在插入的数据为1,2,3,4,5,6,这样有序的数据,或者是逆序 这种情况下的二分搜索树 ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- Java数据结构和算法 - 二叉树
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
- javascript数据结构与算法---二叉树(删除节点)
javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...
- javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)
javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...
随机推荐
- [转]用python爬虫抓站的一些技巧总结 zz
来源网站:http://www.pythonclub.org/python-network-application/observer-spider 学用python也有3个多月了,用得最多的还是各类爬 ...
- qt cmake
写在前面的话:强烈建议优先阅读Qt官网文档对cmake的使用介绍——CMake Manual 前言我去年用clion写Qt的时候,找了很多教程,也没有什么让我觉得很满意的.后来自己摸索,构建了一个我自 ...
- Btree并发内存回收
在并发写Btree原理剖析 一文中提到,节点内存回收有可能导致内存突增以及影响写性能.本文将阐述最近对内存回收的改进,多线程可并行回收内存. 回收策略 采用基于版本的机制,Btree全局维护一个版本号 ...
- ExpressRoute 先决条件和清单
若要使用 ExpressRoute 连接到 Azure 服务,需确认是否符合以下部分中所列的要求. 帐户要求 使用中的有效 Azure 帐户.需有此帐户才能设置 ExpressRoute 线路. 连接 ...
- linux克隆机器
首先你要先点击你的虚拟机点击克隆: 然后执行这个 vim /etc/sysconfig/network-scripts/ifcfg-eth0 去这里修改这两行 然后注释了 然后再执行这个 > / ...
- [翻译] NMBottomTabBarController
NMBottomTabBarController A customisable tab bar controller for iOS written in Objective C. It uses a ...
- 搭建企业级全网数据定时备份方案[cron + rsync]
1.1.1. 服务端的配置[192.168.25.141] Rsync的端口是:873 man rsyncd.conf 查看帮助 Rsync是Redhat默认自带的,这里只是做了rsync服务器端的后 ...
- HTTP 错误 404.3 - Not Found的问题(WCF)
模块 StaticFileModule 通知 ExecuteRequestHandler 处理程序 StaticFile 错误代码 0x80070032 请求的 URL http://10.101.3 ...
- 只要下面看到func() 带括号的,就会弹上去找对应的函数,然后执行相应的函数块
def func1(): print("呵呵")def func2(): print("呵呵")def func3(): print("呵呵" ...
- 12-5 张雨RTCM3数据解码解不出的原因
数据大小:75kB 时间12-4 原因:二进制数据乱码,未通过电文头检验 2018-12-10 08:44:05 张雨RTCM32-MSM4无法固定,连差分都没有