将排序链接列表转换为平衡BST

时间:2020-02-23 14:34:46  来源:igfitidea点击:

在本教程中,我们将看到如何将Sorted LinkedList转换为平衡二进制搜索树。

有两种方法可以做到这一点。

解决方案1:

将排序数组转换为BST非常相似。
查找链接列表的中间元素,并使其root并递归地进行。
时间复杂性:o(nlogn)。

解决方案2:

该解决方案将遵循自下而上的方法而不是自上而下。

  • 我们需要查找链接的长度
  • 我们将首先使用N/2节点递归地创建左子树。
  • 我们将创建根节点并将左子树连接到根节点。
  • 同样创建正确的子树递归,并将根部连接到右子树。

Java程序将Sorted LinkedList转换为Balancy BST:

package org.arpit.theitroad;
 
import org.arpit.theitroad.BinarySearchTreeMain.TreeNode;
 
public class SortedLinkedListToBSTMain {
 
 private Node head;
 
 private static class Node {
 private int value;
 private Node next;
 
 Node(int value) {
 this.value = value;
 
 }
 }
 
 public static class TreeNode {
 int data;
 TreeNode left;
 TreeNode right;
 
 TreeNode(int data) {
 this.data = data;
 }
 }
 
 public static void preOrder(TreeNode root) {
 if (root == null)
 return;
 System.out.print(root.data + " ");
 preOrder(root.left);
 preOrder(root.right);
 }
 
 public void addToTheLast(Node node) {
 
 if (head == null) {
 head = node;
 } else {
 Node temp = head;
 while (temp.next != null)
 temp = temp.next;
 
 temp.next = node;
 }
 }
 
 public void printList(Node head) {
 Node temp = head;
 while (temp != null) {
 System.out.format("%d ", temp.value);
 temp = temp.next;
 }
 System.out.println();
 }
 
 //Find length of linked list using iterative method
 public int lengthOfLinkedList()
 {
 Node temp=head;
 int count = 0;
 while(temp!=null)
 {
 temp=temp.next;
 count++; 
 }
 return count;
 }
 
 public TreeNode convertSortedLinkedListToBST(int n)
 {
 /* Base Case for recursion*/
 if (n <= 0) 
 return null;
 
 /* Recursively creating the left subtree */
 TreeNode left = convertSortedLinkedListToBST(n/2);
 
 /* Create a root node*/
 TreeNode root = new TreeNode(head.value);
 
 //Set pointer to left subtree
 root.left = left;
 head = head.next;
 /* Create right subtree with remaining nodes*/
 root.right = convertSortedLinkedListToBST(n - n/2 - 1);
 
 return root;
 }
 public static void main(String[] args) {
 SortedLinkedListToBSTMain list = new SortedLinkedListToBSTMain();
 //Creating a linked list
 Node head = new Node(10);
 list.addToTheLast(head);
 list.addToTheLast(new Node(20));
 list.addToTheLast(new Node(30));
 list.addToTheLast(new Node(40));
 list.addToTheLast(new Node(50));
 list.addToTheLast(new Node(60));
 list.addToTheLast(new Node(70));
 list.addToTheLast(new Node(80));
 list.addToTheLast(new Node(90));
 System.out.println("Printing linked list :");
 list.printList(head);
 int n =list.lengthOfLinkedList();
 
 TreeNode bst=list.convertSortedLinkedListToBST(n);
 System.out.println("---------------");
 System.out.println("Pre order traversal of binary search tree :");
 preOrder(bst);
 
 }
 
}

运行上面的程序时,我们将得到以下输出:

Printing linked list :
10 20 30 40 50 60 70 80 90 
--------------
Pre order traversal of binary search tree :
50 30 20 10 40 80 70 60 90

时间复杂性:o(n)。