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

  1. 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)

    前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...

  2. Java数据结构和算法(六)--二叉树

    什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...

  3. 数据结构和算法 – 9.二叉树和二叉查找树

      9.1.树的定义   9.2.二叉树 人们把每个节点最多拥有不超过两个子节点的树定义为二叉树.由于限制子节点的数量为 2,人们可以为插入数据.删除数据.以及在二叉树中查找数据编写有效的程序了. 在 ...

  4. Java数据结构和算法(七)--AVL树

    在上篇博客中,学习了二分搜索树:Java数据结构和算法(六)--二叉树,但是二分搜索树本身存在一个问题: 如果现在插入的数据为1,2,3,4,5,6,这样有序的数据,或者是逆序 这种情况下的二分搜索树 ...

  5. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  6. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  7. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  8. javascript数据结构与算法---二叉树(删除节点)

    javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...

  9. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

随机推荐

  1. jdk下载及安装

    下载下载 jdk 下载 java se 版本的即可. web 开发前不需要像安装 java se 一样安装java ee,只要在项目中添加 java ee 的jar 包就可以了,里面大多是接口和抽象类 ...

  2. 【项目管理】git和码云的使用

    缘起 说了那么多关于git和码云相关的事,一直都没给大伙讲解这个码云究竟是个啥玩意儿. 今天就给大伙说说如何通过git和码云搭建属于自己的代码库. 码云 码云(Git@OSC)是开源中国社区团队推出的 ...

  3. Paxos可容错的一致性协议

    一致性问题要求多个process对一个值达成一致.基于消息传递的分布式系统中,在不考虑消息篡改等拜占庭错误的情况下,Paxos可以解决在进程退出,消息延迟,丢失,重复等异常发生的环境中对某个值达成一致 ...

  4. Breathing During Sleep

    TPO24-2 Breathing During Sleep Of all the physiological differences in human sleep compared with wak ...

  5. [IIS | 用户权限] Connect as... 的设置

    ApplicationPoolIdentity is actually the best practice to use in IIS7. It is a dynamically created, u ...

  6. js 时间日期函数小结

    Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...

  7. 基于scrapyd爬虫发布总结

    一.版本情况 python以丰富的三方类库取得了众多程序员的认可,但也因此带来了众多的类库版本问题,本文总结的内容是基于最新的类库版本. 1.scrapy版本:1.1.0 D:\python\Spid ...

  8. Linux setenforce命令详解[SeLinux操作]

    SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统. 关闭SELinux 临时生效: 命令临时 ...

  9. 铁乐学python26_hashlib+configparser+logging模块

    大部份内容摘自博客http://www.cnblogs.com/Eva-J/ hashlib模块算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? ...

  10. 铁乐学python_day21_面向对象编程3

    抽象类和接口类 以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/ 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某 ...