13. Binar daraxtning barcha barglari yozuvini chop etuvchi dastur ishlab chiqing


Download 186.12 Kb.
Pdf ko'rish
Sana27.11.2020
Hajmi186.12 Kb.
#153872
Bog'liq
4-lab


13. Binar daraxtning barcha barglari yozuvini chop etuvchi dastur ishlab chiqing. 

 

#include



 

using namespace std

void print_vector(vector > v){ 

   cout << "[



\n

"; 


   

for

(

int



 i = 

0

; i

      cout << "["; 

      


for

(

int



 j = 

0

; j

         cout << v[i][j] << ", "; 

      } 


      cout << "],

\n

"; 


   } 

   cout << "]"<



class

 

TreeNode

   public: 



      

int


 val; 

      TreeNode *left, *right; 

      TreeNode(

int


 data){ 

         val = data; 

         left = right = NULL; 

      } 


}; 

 

void insert(TreeNode **root, 



int

 val){ 


   queue q; 

   q.push(*root); 

   

while

(q.size()){ 

      TreeNode *temp = q.front(); 

      q.pop(); 

      

if

(

!



temp->left){ 

         



if

(val != NULL) 

            temp->left = new TreeNode(val); 

         



else

 

            temp->left = new TreeNode(



0

); 


         

return

      } 



else

 { 


         q.push(temp->left); 

      } 


      

if

(

!



temp->right){ 

         



if

(val != NULL) 

         temp->right = new TreeNode(val); 

      


else

 

         temp->right = new TreeNode(



0

); 


         

return

      } 



else

 { 


         q.push(temp->right); 

      } 


   } 

TreeNode *make_tree(vector<



int

> v){ 


   TreeNode *root = new TreeNode(v[

0

]); 


   

for

(

int



 i = 

1

; i

      insert(&root, v[i]); 

   } 


   

return

 root; 


   


int

 getHeight(TreeNode* node){ 



      

if

(

!



node)

return

 

0

      


return

 

1

 + 

max


(getHeight(node->left), getHeight(node->right)); 

   } 


   void fill(TreeNode* node, vector>& ret, 

int


 lvl, 

int


 l, 

int


 

r){ 


      

if

(

!



node || node->val == 

0

)

return

      ret[lvl][(l + r) / 



2

] = to_string(node->val); 

      fill(node->left, ret, lvl + 

1

, l, (l + r) / 



2

); 


      fill(node->right, ret, lvl + 

1

, (l + r + 



1

) / 


2

, r); 


   } 

   vector> printTree(TreeNode* root) { 

      

int


 h = getHeight(root); 

      


int

 leaves = (



1

 << h) - 



1

      vector < vector > ret(h, vector (leaves, "")); 



      fill(root, ret, 

0



0

, leaves); 

      


return

 ret; 


   } 

   


int

 main(){ 

    vector<

int


> v = {

1

,

2

,

3

,

4

,

5

,

6

,

7

}; 


    TreeNode *root = make_tree(v); 

    print_vector(printTree(root)); 

 

    


return

 

0



#include



 

using namespace std; 

void print_vector(vector > v){ 

   cout << "[



\n

"; 


   

for

(

int



 i = 

0

; i

      cout << "["; 

      


for

(

int



 j = 

0

; j

         cout << v[i][j] << ", "; 

      } 


      cout << "],

\n

"; 


   } 

   cout << "]"<



class

 

TreeNode

   public: 



      

int


 val; 

      TreeNode *left, *right; 

      TreeNode(

int


 data){ 

         val = data; 

         left = right = NULL; 

      } 


}; 

 

void insert(TreeNode **root, 



int

 val){ 


   queue q; 

   q.push(*root); 

   

while

(q.size()){ 

      TreeNode *temp = q.front(); 

      q.pop(); 

      

if

(

!



temp->left){ 

         



if

(val != NULL) 

            temp->left = new TreeNode(val); 

         



else

 

            temp->left = new TreeNode(



0

); 


         

return

      } 



else

 { 


         q.push(temp->left); 

      } 


      

if

(

!



temp->right){ 

         



if

(val != NULL) 

         temp->right = new TreeNode(val); 

      


else

 

         temp->right = new TreeNode(



0

); 


         

return

      } 



else

 { 


         q.push(temp->right); 

      } 


   } 

TreeNode *make_tree(vector<



int

> v){ 


   TreeNode *root = new TreeNode(v[

0

]); 


   

for

(

int



 i = 

1

; i

      insert(&root, v[i]); 

   } 


   

return

 root; 


   


int

 getHeight(TreeNode* node){ 

      

if

(

!



node)

return

 

0

      


return

 

1

 + 

max


(getHeight(node->left), getHeight(node->right)); 

   } 


   void fill(TreeNode* node, vector>& ret, 

int


 lvl, 

int


 l, 

int


 

r){ 


      

if

(

!



node || node->val == 

0

)

return

      ret[lvl][(l + r) / 



2

] = to_string(node->val); 

      fill(node->left, ret, lvl + 

1

, l, (l + r) / 



2

); 


      fill(node->right, ret, lvl + 

1

, (l + r + 



1

) / 


2

, r); 


   } 

   vector> printTree(TreeNode* root) { 

      

int


 h = getHeight(root); 

      


int

 leaves = (



1

 << h) - 



1

      vector < vector > ret(h, vector (leaves, "")); 



      fill(root, ret, 

0



0

, leaves); 

      


return

 ret; 


   } 

   


int

 main(){ 

    vector<

int


> v = {

1

,

2

,

3

,

4

,

5

,

6

,

7

}; 


    TreeNode *root = make_tree(v); 

    print_vector(printTree(root)); 

 

    


return

 

0



 



 

 

 



2. Berilgan binar daraxt muvozanatlanganmi yoki yo’qligini tekshiring. 

#include  

 

using

 

namespace

 std;  

   


class

 

TreeNode

   


public:

 

      



int

 val; 


      TreeNode *left, *right; 

      TreeNode(



int

 data){ 


         val = data; 

         left = right = 

NULL



      } 



};   

int

 

height

(TreeNode* node);  

   


bool

 

isBalanced

(TreeNode* root)  

{  


    

int

 lh;  


    

int

 rh;  


    

if

 (root == 

NULL

)  


        

return

 

1

;  

   


    lh = height(root->left);  

    rh = height(root->right);  

   

    


if

 (abs(lh - rh) <= 



1

 && isBalanced(root->left) && isBalanced(root-

>right))  

        


return

 

1

;  

   


    

return

 

0

;  

}  


   

int

 

max

(

int

 a, 


int

 b)  


{  

    


return

 (a >= b) ? a : b;  

}  

   


int

 

height

(TreeNode* node)  

{  


    

if

 (node == 

NULL

)  


        

return

 

0

;  


   

    


return

 

1

 + max(height(node->left),  

                   height(node->right));  

}  

   


TreeNode* 

newNode

(

int

 data)  

{  


    TreeNode* Node = 

new

 TreeNode(data);  

    Node->left = 

NULL


;  

    Node->right = 

NULL

;  


   

    


return

 (Node);  

}  

void

 

print_vector

(vector> v){ 

   cout << "[



\n

"; 


   

for

(

int

 i = 

0

; i

      cout << "["; 

      


for

(

int

 j = 

0

; j

         cout << v[i][j] << ", "; 

      } 


      cout << "],

\n

"; 


   } 

   cout << "]"<

 

 



void

 

insert

(TreeNode **root, 

int

 val){ 


   queue q; 

   q.push(*root); 

   

while

(q.size()){ 

      TreeNode *temp = q.front(); 

      q.pop(); 

      

if

(!temp->left){ 

          temp->left = 

new

 TreeNode(val); 

          

return

      } 



else

 { 


         q.push(temp->left); 

      } 


      

if

(!temp->right){ 

         temp->right = 

new

 TreeNode(val); 

         

return

      } 



else

 { 


         q.push(temp->right); 

      } 


   } 

TreeNode *



make_tree

(vector<


int

> v){ 


   TreeNode *root = 

new

 TreeNode(v[



0

]); 


   

for

(

int

 i = 

1

; i

      insert(&root, v[i]); 

   } 


   

return

 root; 


 

 



   

int

 

getHeight

(TreeNode* node){ 

      


if

(!node)


return

 

0

      


return

 

1

 + max(getHeight(node->left), getHeight(node->right)); 

   } 


   

void

 

fill

(TreeNode* node, vector>& ret, 

int

 lvl, 


int

 l, 


int

 

r){ 



      

if

(!node || node->val == 



0

)

return

      ret[lvl][(l + r) / 



2

] = to_string(node->val); 

      fill(node->left, ret, lvl + 

1

, l, (l + r) / 



2

); 


      fill(node->right, ret, lvl + 

1

, (l + r + 



1

) / 


2

, r); 


   } 

   vector> printTree(TreeNode* root) { 

      

int

 h = getHeight(root); 

      

int

 leaves = (



1

 << h) - 



1

      vector < vector > ret(h, vector (leaves, "")); 



      fill(root, ret, 

0



0

, leaves); 

      


return

 ret; 


   } 

   


int

 main()  

{  

    TreeNode* root = newNode(



1

);  


    root->left = newNode(

2

);  


    root->right = newNode(

3

);  


    root->left->left = newNode(

4

);  


    root->left->right = newNode(

5

);  


    root->left->left->left = newNode(

8

);  


   

    print_vector(printTree(root)); 

    

if

 (isBalanced(root))  

        cout << "Binar daraxt muvozanatlangan";  

    


else

 

        cout << "Binar daraxt muvozanatlangan";  



    

return

 

0



;  

}  


 

Download 186.12 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling