应该掌握的经常使用的数据结构:数组,单链表,栈。队列,二叉树。
应该掌握的经常使用的算法:顺序查找。二分查找。冒泡排序,选择排序,插入排序。深度优先算法。广度优先算法
进阶数据结构:双链表。循环链表,双端队列,哈希表,跳表。大根/小根堆。哈夫曼树,排序二叉树。平衡二叉树,红黑树,B树/B+树。图,etc。
进阶算法:二叉排序树查找;高速排序。希尔排序,堆排序。归并排序,桶排序,基数排序。KMP字符串匹配算法 。
* @brief 二叉树
*/
public class BinaryTree {
private TreeNode root=null;
public BinaryTree(){
root=new TreeNode(1,"rootNode(A)");
}
/**
* 创建一棵二叉树
* -----------------------------
* A
* B C
* D E F
* ----------------------------
*/
public void createBinTree(TreeNode root){
TreeNode newNodeB = new TreeNode(2,"B");
TreeNode newNodeC = new TreeNode(3,"C");
TreeNode newNodeD = new TreeNode(4,"D");
TreeNode newNodeE = new TreeNode(5,"E");
TreeNode newNodeF = new TreeNode(6,"F");
root.leftChild=newNodeB;
root.rightChild=newNodeC;
root.leftChild.leftChild=newNodeD;
root.leftChild.rightChild=newNodeE;
root.rightChild.rightChild=newNodeF;
}
public boolean isEmpty(){
return root==null;
}
//树的高度
public int height(){
return height(root);
}
//节点个数
public int size(){
return size(root);
}
private int height(TreeNode subTree){
if(subTree==null)
return 0;//递归结束:空树高度为0
else{
int i=height(subTree.leftChild);
int j=height(subTree.rightChild);
return (i<j)?(j+1):(i+1);
}
}
private int size(TreeNode subTree){
if(subTree==null){
return 0;
}else{
return 1+size(subTree.leftChild)
+size(subTree.rightChild);
}
}
//返回双亲结点
public TreeNode parent(TreeNode element){
return (root==null|| root==element)?
null:parent(root, element);
}
public TreeNode parent(TreeNode subTree,TreeNode element){
if(subTree==null)
return null;
if(subTree.leftChild==element||subTree.rightChild==element)
//返回父结点地址
return subTree;
TreeNode p;
//如今左子树中找。假设左子树中没有找到,才到右子树去找
if((p=parent(subTree.leftChild, element))!=null)
//递归在左子树中搜索
return p;
else
//递归在右子树中搜索
return parent(subTree.rightChild, element);
}
public TreeNode getLeftChildNode(TreeNode element){
return (element!=null)?element.leftChild:null;
}
public TreeNode getRightChildNode(TreeNode element){
return (element!=null)?
element.rightChild:null;
}
public TreeNode getRoot(){
return root;
}
//在释放某个结点时,该结点的左右子树都已经释放。
//所以应该採用兴许遍历,当訪问某个结点时将该结点的存储空间释放
public void destroy(TreeNode subTree){
//删除根为subTree的子树
if(subTree!=null){
//删除左子树
destroy(subTree.leftChild);
//删除右子树
destroy(subTree.rightChild);
//删除根结点
subTree=null;
}
}
public void traverse(TreeNode subTree){
System.out.println("key:"+subTree.key+"--name:"+subTree.data);;
traverse(subTree.leftChild);
traverse(subTree.rightChild);
}
//前序遍历
public void preOrder(TreeNode subTree){
if(subTree!=null){
&n
DotNetty网络通信框架学习
DotNetty网络通信框架学习之源码分析
MODBUS协议解析中常用的转换帮助类(C#)
C# 键盘钩子
C# 实现http不同方法的请求
C# 中List<T>与DataSet之间的转换
C# 将文件夹中文件复制到另一个文件夹
WinForm中 Asp.Net Signalr消息推送测试实例
redis安装教程