Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมแปลง linked list เป็น binary search tree ใน C++


สมมติว่ามี singly linked list ที่สมาชิกจัดเรียงในลำดับไม่ลดลง เราต้องแปลงมันเป็น height balanced binary search tree ถ้าลิสต์เป็น [-10, -3, 0, 5, 9] ต้นไม้ที่เป็นไปได้จะเป็นแบบ −

โปรแกรมแปลง linked list เป็น binary search tree ใน C++

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −

  • ถ้าลิสต์ว่างเปล่า แล้ว
    • คืนค่า null
  • กำหนดเมธอดเรียกซ้ำ sortedListToBST() รับโหนดเริ่มต้นของลิสต์
  • x := ที่อยู่ของโหนดก่อนหน้าโหนดกลางจากลิสต์ a
  • mid := โหนดกลางที่แท้จริง
  • สร้างโหนดใหม่ด้วยค่าจาก mid
  • nextStart := next ของโหนด mid
  • ตั้งค่า next ของ mid เป็น null
  • right ของโหนด := sortedListToBST(nextStart)
  • ถ้า x ไม่ใช่ null แล้ว
    • next ของ x = null และ left ของโหนด := sortedListToBST(a)
  • คืนค่าโหนด

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

ตัวอย่าง

#include <bits/stdc++.h> using namespace std; class ListNode{    public:    int val;    ListNode *next;    ListNode(int data){       val = data;       next = NULL;    } }; ListNode *make_list(vector<int> v){    ListNode *head = new ListNode(v[0]);    for(int i = 1; i<v.size(); i++){       ListNode *ptr = head;       while(ptr->next != NULL){          ptr = ptr->next;       }       ptr->next = new ListNode(v[i]);    }    return head; } class TreeNode{    public:    int val;    TreeNode *left, *right;    TreeNode(int data){       val = data;       left = right = NULL;    } }; void inord(TreeNode *root){    if(root != NULL){       inord(root->left);       cout << root->val << " ";       inord(root->right);    } } class Solution {    public:    pair <ListNode*, ListNode*> getMid(ListNode* a){       ListNode* prev = NULL;       ListNode* fast = a;       ListNode* slow = a;       while(fast && fast->next){          fast = fast->next->next;          prev = slow;          slow = slow->next;       }       return {prev, slow};    }    TreeNode* sortedListToBST(ListNode* a) {       if(!a)return NULL;          pair<ListNode*, ListNode*> x = getMid(a);          ListNode* mid = x.second;          TreeNode* Node = new TreeNode(mid->val);          ListNode* nextStart = mid->next;          mid->next = NULL;          Node->right = sortedListToBST(nextStart);          if(x.first){             x.first->next = NULL;             Node->left = sortedListToBST(a);       }       return Node;    } }; main(){    vector<int> v = {-10,-3,0,5,9};    ListNode *head = make_list(v);    Solution ob;    inord(ob.sortedListToBST(head)); }

อินพุท

[-10,-3,0,5,9]

เอาต์พุท

-10 -3 0 5 9