数据结构与算法之二叉树 ——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 ...
随机推荐
- Django 模板语言 标签
前言:django的模板语法基本和flask的jinja2基本一样.下面比较一下两个模板语法的区别. ------深度变量的查找(万能的句点号) 在 Django 模板中遍历复杂数据结构的关键是句点字 ...
- Angularjs controller之间的通信
刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: <html> <script src=" ...
- asp.net --- Menu控件\CSS 和样式
几乎 Menu 控件外观的各个方面都可以使用 Menu 控件的属性或级联样式表 (CSS) 来管理.通过了解哪些属性控制呈现的哪些方面,可以定制菜单的外观.本主题介绍由 Menu 控件公开的样式类型, ...
- 如何生成.p12文件
如何生成.p12文件 1. 打开钥匙串 2. 钥匙串选登录,种类选证书 3. 选择开发者,然后导出证书 4. 存储证书 5. 选择存储的时候会提示输入证书的密码,当然,也可以不用输入密码 6. 点击上 ...
- Python(二)列表的增删改查
一,列表的增删改查 列表中增加元素: 1,从列表的末尾增加一个元素:append("") 2,从列表中插入一个元素:insert(下标位置,插入的元素) 合并列表: 1,name. ...
- Python学习---模拟微信网页登录180410
WEB微信 网页登录的猜想: a. 访问页面出现二维码 b. 长轮询监听是否已经扫码并且点击确认 c. 如何进行会话保持 d. 如何获取用户列表 e. 如何发送消息(接收消息) 过程:访问微信官网[h ...
- 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)
一.初识MySQL数据库 ###<1>数据库概述 1. 数据库 长期存储在计算机内的,由组织的可共享的数据集合 存储数据的仓库 文件 ...
- [2018HN省队集训D1T3] Or
[2018HN省队集训D1T3] Or 题意 给定 \(n\) 和 \(k\), 求长度为 \(n\) 的满足下列条件的数列的数量模 \(998244353\) 的值: 所有值在 \([1,2^k)\ ...
- 用eval似乎会执行结果一次性返回,结果显示的是一行
with open(r'商品资料','r',encoding='utf-8') as f1: lis_goods = eval(f1.read()) # 用eval似乎会执行结果一次性返回,结果显示的 ...
- 判断是否是微信浏览器JavaScript代码
function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMe ...