输入多个整数,构建avl树,输出叶子结点数,前序,后序,中序遍历的结果
时间: 2024-10-21 17:17:43 浏览: 17
AVL树(Adelson-Velsky and Landis Tree)是一种自平衡的二叉查找树,它的特点是每个节点的两个子树的高度差最多为1。为了插入多个整数并构建AVL树,我们需要遵循以下步骤:
1. **输入**:首先,获取用户的输入,这些输入是一系列的整数。
```java
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一组整数(用空格分隔):");
List<Integer> numbers = new ArrayList<>();
while (scanner.hasNextInt()) {
numbers.add(scanner.nextInt());
}
```
2. **构建AVL树**:使用递归的方法构建AVL树。对于每个插入的元素,我们先找到其正确的位置,然后根据 AVL 树的性质进行旋转调整。
```java
class Node {
int value;
Node left, right;
int height;
// 构造器和其他辅助方法省略
}
public Node buildAVLTree(int[] arr) {
if (arr.length == 0)
return null;
Node root = new Node(arr[0]);
for (int i = 1; i < arr.length; i++) {
root = insert(root, arr[i]);
}
return root;
}
private Node insert(Node node, int value) {
// 插入逻辑,包括平衡调整
// ...
}
```
3. **计算叶节点数**:在AVL树中,叶子节点是没有子节点的节点。我们可以遍历根节点开始,直到找到叶子节点。
```java
int leafCount = countLeaves(root);
...
private int countLeaves(Node node) {
if (node == null)
return 0;
else if (node.left == null && node.right == null)
return 1;
else
return countLeaves(node.left) + countLeaves(node.right);
}
```
4. **遍历**:要得到前序、后序和中序遍历的结果,可以直接调用对应的遍历方法。
```java
String[] traversalOrders = {"Preorder", "Inorder", "Postorder"};
for (String order : traversalOrders) {
switch (order) {
case "Preorder":
System.out.printf("%s traversal: %s%n", order, preOrderTraversal(root));
break;
case "Inorder":
System.out.printf("%s traversal: %s%n", order, inOrderTraversal(root));
break;
case "Postorder":
System.out.printf("%s traversal: %s%n", order, postOrderTraversal(root));
break;
}
}
// 前序、中序和后序遍历方法
private String preOrderTraversal(Node node) {
if (node == null)
return "";
return node.value + preOrderTraversal(node.left) + preOrderTraversal(node.right);
}
private String inOrderTraversal(Node node) {
// ...
}
private String postOrderTraversal(Node node) {
// ...
}
```
阅读全文