数据结构与算法之二叉树 ——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 ...
随机推荐
- leetCode题解之Product of Array Except Self
1.题目描述 2.题目分析 每个元素对应的积应该是 它 前面的每个元素的积,和后面的每个元素的积 3.代码 vector<int> productExceptSelf(vector< ...
- git学习——简介、使用(一)
本文是作者参考其他教程学习git的记录,原文:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c01 ...
- SQLSERVER数据库备份操作和还原操作做了什么
SQLSERVER数据库备份操作和还原操作做了什么 看了这篇文章:还原/备份时做了些什么 自己也测试了一下,下面说的错误日志指的是SQLSERVER ERRORLOG 一般在C:\Program Fi ...
- 手动配置wnmp环境
wamp 是什么? windows,nginx,mysql,php(当然也可以是PYTHON等) 只所以使用nginx,是因为我等下要配置ZendGuardLoader ZendGuardLoader ...
- CompletionService和ExecutorCompletionService
CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象. 如果你向Executor提交了一个批处理任务,并且希 ...
- UIWindow,UINavigationController与UIViewController之间的关系
UIWindow,UINavigationController与UIViewController之间的关系 虽然每次你都用UINavigationController与UIWindow,但你不一定知道 ...
- svn回退到具体的版本
svn回退到具体的版本 找到项目的版本号 命令行中输入相关命令 到指定地点找到项目即可
- Linux /dev/null详解
常用的命令展示 /dev/null 和 /dev/zero的区别 1./dev/null:表示 的是一个黑洞,通常用于丢弃不需要的数据输出, 或者用于输入流的空文件 ...
- layer的alert图
layer.alert("xxx",1); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 及以后
- September 25th 2017 Week 39th Monday
No man is rich enough to buy back his own past. 没有人富有到可以赎回自己的过去. Those rich are not willing to buy b ...