Hash算法和二叉树
程序员文章站
2022-05-06 22:43:20
...
什么是Hash算法
哈希算法可以将任意长度的二进制值映射为较短的,固定长度的二进制值。我们把这个二进制值成为哈希值。
Hash算法有什么特点
1.哈希值是二进制值;
2.哈希值具有一定的唯一性;
3. 哈希值极其紧凑;
4. 要找到生成同一个哈希值的2个不同输入,在一定时间范围内,是不可能的。
哈希算法的应用
public int hashCode(){
int offset;
int h=hashCode();
if(h==0){
int off=offset;
char val[]=value;
int len=count;
for(int i=0;i<len;i++){
h=31*h+val[off++];
}
hashCode()=h;
}
return h;
}
---------------------------------分割线-----------------------------------------------------------------------------
什么是二叉树
如图所示:二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树分类
满二叉树:二叉树中,所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。
完全二叉树:在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一棵完全二叉树。
为了详细介绍,下面用代码实现`
public class TreeNode {
// 左节点(儿子)
private TreeNode lefTreeNode;
// 右节点(儿子)
private TreeNode rightNode;
// 数据
private int value;
public TreeNode(int value) {
this.value=value;
}
public TreeNode getLefTreeNode() {
return lefTreeNode;
}
public void setLefTreeNode(TreeNode lefTreeNode) {
this.lefTreeNode = lefTreeNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
public class TreeRoot {
private TreeNode treeRoot;
public TreeNode getTreeRoot() {
return treeRoot;
}
public void setTreeRoot(TreeNode treeRoot) {
this.treeRoot = treeRoot;
}
/**
* 先序遍历
* @param rootTreeNode 根节点
*/
public static void preTraverseBTree(TreeNode rootTreeNode) {
if (rootTreeNode != null) {
//访问根节点
System.out.println(rootTreeNode.getValue());
//访问左节点
preTraverseBTree(rootTreeNode.getLefTreeNode());
//访问右节点
preTraverseBTree(rootTreeNode.getRightNode());
}
}
/**
* 中序遍历
* @param rootTreeNode 根节点
*/
public static void inTraverseBTree(TreeNode rootTreeNode) {
if (rootTreeNode != null) {
//访问左节点
inTraverseBTree(rootTreeNode.getLefTreeNode());
//访问根节点
System.out.println(rootTreeNode.getValue());
//访问右节点
inTraverseBTree(rootTreeNode.getRightNode());
}
}
/**
* 动态创建二叉查找树
*
* @param treeRoot 根节点
* @param value 节点的值
*/
public static void createTree(TreeRoot treeRoot, int value) {
//如果树根为空(第一次访问),将第一个值作为根节点
if (treeRoot.getTreeRoot() == null) {
TreeNode treeNode = new TreeNode(value);
treeRoot.setTreeRoot(treeNode);
} else {
//当前树根
TreeNode tempRoot = treeRoot.getTreeRoot();
while (tempRoot != null) {
//当前值大于根值,往右边走
if (value > tempRoot.getValue()) {
//右边没有树根,那就直接插入
if (tempRoot.getRightNode() == null) {
tempRoot.setRightNode(new TreeNode(value));
return ;
} else {
//如果右边有树根,到右边的树根去
tempRoot = tempRoot.getRightNode();
}
} else {
//左没有树根,那就直接插入
if (tempRoot.getLefTreeNode() == null) {
tempRoot.setLefTreeNode(new TreeNode(value));
return;
} else {
//如果左有树根,到左边的树根去
tempRoot = tempRoot.getLefTreeNode();
}
}
}
}
}
}
==二叉树的遍历:==前序遍历(根左右),中序遍历(左根右),后序遍历(左右根),层序遍历。
上一篇: 关于html元素类型分类和使用等详细解析