用Java写程序:实现用AVL树存储身份信息类,同时AVL树的值是字符串身份证号码
时间: 2023-06-10 10:07:21 浏览: 48
好的,下面是用Java实现AVL树存储身份信息类的示例代码:
```java
public class IdentityInfo {
private String name;
private String idNumber;
public IdentityInfo(String name, String idNumber) {
this.name = name;
this.idNumber = idNumber;
}
public String getName() {
return name;
}
public String getIdNumber() {
return idNumber;
}
}
public class AVLTreeNode {
private IdentityInfo identityInfo;
private AVLTreeNode left;
private AVLTreeNode right;
private int height;
public AVLTreeNode(IdentityInfo identityInfo) {
this.identityInfo = identityInfo;
this.left = null;
this.right = null;
this.height = 1;
}
public IdentityInfo getIdentityInfo() {
return identityInfo;
}
public AVLTreeNode getLeft() {
return left;
}
public void setLeft(AVLTreeNode left) {
this.left = left;
}
public AVLTreeNode getRight() {
return right;
}
public void setRight(AVLTreeNode right) {
this.right = right;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
public class AVLTree {
private AVLTreeNode root;
public AVLTree() {
this.root = null;
}
private int getHeight(AVLTreeNode node) {
if (node == null) {
return 0;
}
return node.getHeight();
}
private int getBalanceFactor(AVLTreeNode node) {
if (node == null) {
return 0;
}
return getHeight(node.getLeft()) - getHeight(node.getRight());
}
private AVLTreeNode rotateLeft(AVLTreeNode node) {
AVLTreeNode rightNode = node.getRight();
AVLTreeNode leftRightNode = rightNode.getLeft();
rightNode.setLeft(node);
node.setRight(leftRightNode);
node.setHeight(Math.max(getHeight(node.getLeft()), getHeight(node.getRight())) + 1);
rightNode.setHeight(Math.max(getHeight(rightNode.getLeft()), getHeight(rightNode.getRight())) + 1);
return rightNode;
}
private AVLTreeNode rotateRight(AVLTreeNode node) {
AVLTreeNode leftNode = node.getLeft();
AVLTreeNode rightLeftNode = leftNode.getRight();
leftNode.setRight(node);
node.setLeft(rightLeftNode);
node.setHeight(Math.max(getHeight(node.getLeft()), getHeight(node.getRight())) + 1);
leftNode.setHeight(Math.max(getHeight(leftNode.getLeft()), getHeight(leftNode.getRight())) + 1);
return leftNode;
}
public void insert(IdentityInfo identityInfo) {
this.root = insert(this.root, identityInfo);
}
private AVLTreeNode insert(AVLTreeNode node, IdentityInfo identityInfo) {
if (node == null) {
return new AVLTreeNode(identityInfo);
}
if (identityInfo.getIdNumber().compareTo(node.getIdentityInfo().getIdNumber()) < 0) {
node.setLeft(insert(node.getLeft(), identityInfo));
} else if (identityInfo.getIdNumber().compareTo(node.getIdentityInfo().getIdNumber()) > 0) {
node.setRight(insert(node.getRight(), identityInfo));
} else {
return node;
}
node.setHeight(Math.max(getHeight(node.getLeft()), getHeight(node.getRight())) + 1);
int balanceFactor = getBalanceFactor(node);
if (balanceFactor > 1 && identityInfo.getIdNumber().compareTo(node.getLeft().getIdentityInfo().getIdNumber()) < 0) {
return rotateRight(node);
}
if (balanceFactor < -1 && identityInfo.getIdNumber().compareTo(node.getRight().getIdentityInfo().getIdNumber()) > 0) {
return rotateLeft(node);
}
if (balanceFactor > 1 && identityInfo.getIdNumber().compareTo(node.getLeft().getIdentityInfo().getIdNumber()) > 0) {
node.setLeft(rotateLeft(node.getLeft()));
return rotateRight(node);
}
if (balanceFactor < -1 && identityInfo.getIdNumber().compareTo(node.getRight().getIdentityInfo().getIdNumber()) < 0) {
node.setRight(rotateRight(node.getRight()));
return rotateLeft(node);
}
return node;
}
public IdentityInfo search(String idNumber) {
AVLTreeNode node = search(this.root, idNumber);
if (node == null) {
return null;
}
return node.getIdentityInfo();
}
private AVLTreeNode search(AVLTreeNode node, String idNumber) {
if (node == null || node.getIdentityInfo().getIdNumber().equals(idNumber)) {
return node;
}
if (idNumber.compareTo(node.getIdentityInfo().getIdNumber()) < 0) {
return search(node.getLeft(), idNumber);
} else {
return search(node.getRight(), idNumber);
}
}
}
```
在这个示例代码中,`IdentityInfo`类表示身份信息,包含`name`和`idNumber`字段。`AVLTreeNode`类表示AVL树中的节点,包含`identityInfo`、`left`、`right`和`height`字段。`AVLTree`类表示AVL树,包含`root`字段和`insert()`、`search()`等方法来操作AVL树。在`insert()`方法中,我们使用字符串身份证号码来比较节点大小,从而将新的身份信息插入到AVL树中。在`search()`方法中,我们也使用字符串身份证号码来搜索身份信息。