对二叉树和平衡二叉树实现
来源:互联网 发布:入门级手表 知乎 编辑:程序博客网 时间:2024/04/27 17:13
二叉树实现和平衡二叉树实现
package cn.itcast.shujujiegou.tree;/** * Created by likailong on 2016/9/28. * 二叉查找树要求所有的项都可以排序故实现某一个接口 * 数不能太深 */public class BinarySearchTree<T extends Comparable<? super T>>{ private static class BinaryNode<T> { T element;//数据 BinaryNode<T> left;//左节点 BinaryNode<T> right;//右节点 BinaryNode(T theElement){//初始化 this(theElement,null,null); } BinaryNode(T theElement,BinaryNode<T> lt,BinaryNode<T>rt){ element=theElement; left=lt; right=rt; } } private BinaryNode<T> root; public BinarySearchTree(){ root=null; } public void makeEmpty(){ root=null; } public boolean isEmpty(){ return root==null; } public boolean contains(T x){ return contains(x,root); } private boolean contains(T x,BinaryNode<T> t){ if(t==null) return false; int compareResult=x.compareTo(t.element); if(compareResult<0) return contains(x,t.left); else if(compareResult>0) return contains(x,t.right); else return true; } public T findMin(){ if(isEmpty()) throw new UnderflowException("没有根结点"); return findMin(root).element; } public T findMax(){ if(isEmpty()) throw new UnderflowException("没有根结点"); return findMax(root).element; } public BinaryNode<T> findMax(BinaryNode<T> t){ if(t!=null) while (t.right!=null) t=t.right; return t; } public BinaryNode<T> findMin(BinaryNode<T> t){ if(t==null){ return null; }else if(t.left==null) return t; return findMin(t.left); } public void insert(T x){ root=insert(x,root); } private BinaryNode<T> insert(T x,BinaryNode<T> t){ if(t==null) return new BinaryNode<T>(x,null,null); int compareResult=x.compareTo(t.element); if(compareResult>0) t.left=insert(x,t.left); else if(compareResult>0) t.right=insert(x,t.right); else; return t; } public void remove(T x){ root=remove(x,root); } private BinaryNode<T> remove(T x,BinaryNode<T> t){ if(t==null) return t; int comparResult=x.compareTo(t.element); if(comparResult<0) t.left=remove(x,t.left); else if(comparResult>0) t.right=remove(x,t.right); else if(t.left!=null&&t.right!=null){ t.element=findMin(t.right).element; t.right=remove(t.element,t.right); }else t=(t.left!=null)?t.left:t.right; return t; } public void printTree(){ if(isEmpty()) System.out.print("-----null tree----"); else printTree(root); } public int height(){ return height(root); } private int height(BinaryNode<T> t){ if(t==null) return -1; else return 1+Math.max(height(t.left),height(t.right)); } private void printTree(BinaryNode<T> t){ if(t!=null){ printTree(t.left); System.out.println(t.element); printTree(t.right); } }}平衡树的实现
package cn.itcast.shujujiegou.tree;/** * Created by likailong on 2016/9/28. */public class AVLTree<T extends Comparable<? super T>> { private AvlNode<T> root; public AVLTree(){ root=null; } private static class AvlNode<T> { T element; AvlNode<T >left; AvlNode<T> right; int height; AvlNode(T theElement){ this(theElement,null,null); } AvlNode(T theElement,AvlNode<T> lt,AvlNode<T> rt){ left=lt; right=rt; element=theElement; } } public void insert(T element){ root=insert(element,root); } private AvlNode<T> insert(T x,AvlNode<T> t){ if(t==null) return new AvlNode<T>(x,null,null); int compareResult=x.compareTo(t.element); if(compareResult<0) t.left=insert(x,t.left); else if(compareResult>0) t.right=insert(x,t.right); else ; return balance(t); } private static final int ALLOW_IMBALANCE=1; private AvlNode<T> balance(AvlNode<T> t) { if(t==null) return null; if(height(t.left)-height(t.right)>ALLOW_IMBALANCE){ if(height(t.left.left)>=height(t.left.right)) t=rotateWithLeftChild(t); else t=doubleWithLeftChild(t); } else{ if(height(t.right)-height(t.left)>ALLOW_IMBALANCE){ if(height(t.right.right)>=height(t.right.left)) t=rotateWithRightChild(t); else t=doubleWithRightChild(t); } } t.height=Math.max(height(t.left),height(t.right))+1; return t; } private AvlNode<T> rotateWithRightChild(AvlNode<T> k2 ){ AvlNode<T> k1=k2.right; k2.right=k1.left; k1.left=k2; k2.height=Math.max(height(k2.left),height(k2.right))+1; k1.height=Math.max(height(k1.left),k2.height)+1; return k1; } private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2 ){ AvlNode<T> k1=k2.left; k2.left=k1.right; k1.right=k2; k2.height=Math.max(height(k2.left),height(k2.right))+1; k1.height=Math.max(height(k1.left),k2.height)+1; return k1; } private AvlNode<T> doubleWithLeftChild(AvlNode<T> k3 ){ k3.left=rotateWithRightChild(k3.left); return rotateWithLeftChild(k3); } private AvlNode<T> doubleWithRightChild(AvlNode<T> k3 ){ k3.left=rotateWithLeftChild(k3.left); return rotateWithRightChild(k3); } public int height(){ return height(root); } private int height(AvlNode<T>t){ return t==null?-1:t.height; } public void remove(T x){ root=remove(x,root); } private AvlNode<T> remove(T x,AvlNode<T> t){ if(t==null) return null; int compareResult=x.compareTo(t.element); if(compareResult<0) t.left=remove(x,t.left); else if(compareResult>0) t.right=remove(x,t.right); else if(t.left!=null&&t.right!=null){ t.element=(T)findMin(t.right).element; t.right=remove(t.element,t.right); } else t=(t.left!=null)?t.left:t.right; return balance(t); } private AvlNode findMin(AvlNode<T> t) { if(t==null){ return null; }else if(t.left==null) return t; return findMin(t.left); } public T findMin(){ return (T)findMin(root).element; } public T findMax(){ return (T)findMax(root).element; } private AvlNode<T> findMax(AvlNode<T> t){ if(t!=null) while (t.right!=null) t=t.right; return t; }}
0 0
- 对二叉树和平衡二叉树实现
- 对二叉树和平衡树测试
- 平衡二叉树 实现
- 平衡二叉树实现
- 实现平衡二叉树
- 平衡二叉树实现
- perl 实现二叉树,二叉平衡树
- 搜索二叉树和平衡二叉树
- java --平衡二叉树实现
- AVLTree 二叉平衡树 实现
- C++实现平衡二叉树
- 平衡二叉树实现-旋转
- 平衡二叉树实现-删除
- 平衡二叉树基本实现
- AVL实现平衡二叉树
- 平衡二叉树的实现
- java实现二叉平衡树
- JS实现平衡二叉树
- BZOJ 4195 && NOI 2015 并查集
- 全排列,字典顺序问题 ( permutations/leetcode)
- hdu1005
- 欢迎使用CSDN-markdown编辑器
- windows系统下安装和使用ROS的解决方案 (1 win_ros 2 rosserial_windows)
- 对二叉树和平衡二叉树实现
- 第5周 项目5 - 后缀表达式
- c语言结构体对齐
- 占个坑,最近太忙了,没时间写博客啊,我先占个坑
- SPOJ 7001 Visible Lattice Points (莫比乌斯反演)
- 面向对象_继承中成员变量的关系
- hadoop集群常见问题集锦
- oracle客户端安装和PLSQL、SQL navigator配置
- 剑指offer(2)-Power()函数