树排序Java程序
时间:2020-01-09 10:35:37 来源:igfitidea点击:
本教程介绍了如何用Java编写Tree排序程序。树排序使用二进制搜索树(BST)对元素进行排序。
什么是二叉搜索树
二进制搜索树(BST)是一种特殊的二进制树,其中节点的左子节点的值小于其父节点的值,而节点的右子节点的值大于或者等于其父节点的值。
下图显示了带有节点的二叉搜索树。如我们所见,左子树的节点值小于根节点,右子树的节点值大于根节点。
树排序算法
树排序工作如下
- 使用输入数组中的元素创建二元搜索树。
- 对BST进行有序遍历以按排序顺序获取元素。通过先访问左子树节点,然后依次访问根节点和右子树节点,可以完成有序遍历。
树排序Java程序
要表示一个BST节点,需要一个Node类,该类具有两个引用。这些参考分别指左孩子和右孩子。此类Node用于创建BST的节点。
class Node{
int value;
Node left;
Node right;
Node(int value){
this.value = value;
left = null;
right = null;
}
}
树排序
// Class for tree nodes
class Node{
int value;
Node left;
Node right;
Node(int value){
this.value = value;
left = null;
right = null;
}
}
// Class for Binary Search Tree
class BST{
Node node;
BST(int value){
node = new Node(value);
}
public Node insert(Node node, int value){
if(node == null){
return new Node(value);
}
// Move to left for value less than parent node
if(value < node.value){
node.left = insert(node.left, value);
}
// Move to right for value greater than parent node
else if(value > node.value){
node.right = insert(node.right, value);
}
return node;
}
// For traversing in order
public void inOrder(Node node){
if(node != null){
// recursively traverse left subtree
inOrder(node.left);
System.out.print(node.value + " ");
// recursively traverse right subtree
inOrder(node.right);
}
}
}
public class TreeSort {
public static void main(String[] args) {
int[] arr = {65, 68, 82, 42, 10, 75, 25, 47, 32, 72};
System.out.println("Original array- " + Arrays.toString(arr));
// start creating tree with element at index 0 as root node
BST bst = new BST(arr[0]);
for(int num : arr){
bst.insert(bst.node, num);
}
System.out.print("Sorted Array after Tree sort- ");
bst.inOrder(bst.node);
System.out.println();
}
}
输出:
Original array- [65, 68, 82, 42, 10, 75, 25, 47, 32, 72] Sorted Array after Tree sort- 10 25 32 42 47 65 68 72 75 82
树排序时间和空间复杂度
树排序的平均案例时间复杂度为O(n logn)。
如果树是不平衡的二叉树,则在最坏的情况下添加一项需要O(n)时间。这意味着树排序的最坏情况下的时间复杂度为O(n2)。
由于将为n个元素创建n个节点,因此辅助空间需求为n。因此,树排序的空间复杂度为O(n)。

