树排序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)。