在二叉搜索树上执行右旋转的 C++ 程序

二叉搜索树是一种二叉树" title="排序二叉树">排序二叉树,其中所有节点都具有以下两个属性 -

节点的右子树的键大于其父节点的键。

节点的左子树的键小于或等于其父节点的键。

每个节点不应有超过两个子节点。

树旋转是一种改变结构而不干扰二叉树上元素顺序的操作。它在树中向上移动一个节点,向下移动一个节点。它用于改变树的形状,并通过向下移动较小的子树和向上移动较大的子树来降低其高度,从而提高许多树操作的性能。旋转的方向取决于树节点移动的一侧,而其他人则说这取决于哪个孩子占据了根的位置。这是一个在二叉搜索树上执行左旋转的 C++ 程序。

算法

Begin

   Create a structure avl to declare variables data d, a left pointer l and a right pointer r.

   Declare a class avl_tree to declare following functions:

   height() - To calculate height of the tree by max function.

   Difference() - To calculate height difference of the tree.

   rr_rotat() - For right-right rotation of the tree.

   ll_rotat() - For left-left rotation of the tree.

   lr_rotat() - For left-right rotation of the tree.

   rl_rotat() - For right-left rotation of the tree.

   balance() - Balance the tree by getting balance factor. Put the difference in bal_factor. If bal_factor>1 balance the left subtree.

   If bal_factor<-1 balance the right subtree.

   insert() - To insert the elements in the tree.

   show() - To print the tree.

   inorder() - To print inorder traversal of the tree.

   preorder() - To print preorder traversal of the tree.

   postorder() - To print postorder traversal of the tree.

   In main(), perform switch operation and call the functions as per choice.

End.

示例

#include<iostream>

#include<cstdio>

#include<sstream>

#include<algorithm>

#define pow2(n) (1 << (n))

using namespace std;

struct avl {

   int d;

   struct avl *l;

   struct avl *r;

}*r;

class avl_tree {

   public:

      int height(avl *);

      int difference(avl *);

      avl *rr_rotat(avl *);

      avl *ll_rotat(avl *);

      avl *lr_rotat(avl*);

      avl *rl_rotat(avl *);

      avl * balance(avl *);

      avl * insert(avl*, int);

      void show(avl*, int);

      void inorder(avl *);

      void preorder(avl *);

      void postorder(avl*);

      avl_tree() {

         r = NULL;

      }

};

int avl_tree::height(avl *t) {

   int h = 0;

   if (t != NULL) {

      int l_height = height(t->l);

      int r_height = height(t->r);

      int max_height = max(l_height, r_height);

      h = max_height + 1;

   }

   return h;

}

int avl_tree::difference(avl *t) {

   int l_height = height(t->l);

   int r_height = height(t->r);

   int b_factor = l_height - r_height;

   return b_factor;

}

avl *avl_tree::rr_rotat(avl *parent) {

   avl *t;

   t = parent->r;

   parent->r = t->l;

   t->l = parent;

   cout<<"Right-Right Rotation";

   return t;

}

avl *avl_tree::ll_rotat(avl *parent) {

   avl *t;

   t = parent->l;

   parent->l = t->r;

   t->r = parent;

   cout<<"Left-Left Rotation";

   return t;

}

avl *avl_tree::lr_rotat(avl *parent) {

   avl *t;

   t = parent->l;

   parent->l = rr_rotat(t);

   cout<<"Left-Right Rotation";

   return ll_rotat(parent);

}

avl *avl_tree::rl_rotat(avl *parent) {

   avl *t;

   t= parent->r;

   parent->r = ll_rotat(t);

   cout<<"Right-Left Rotation";

   return rr_rotat(parent);

}

avl *avl_tree::balance(avl *t) {

   int bal_factor = difference(t);

   if (bal_factor > 1) {

      if (difference(t->l) > 0)

         t = ll_rotat(t);

      else

         t = lr_rotat(t);

   }

   else if (bal_factor < -1) {

      if (difference(t->r) > 0)

         t= rl_rotat(t);

      else

         t = rr_rotat(t);

   }

   return t;

}

avl *avl_tree::insert(avl *r, int v) {

   if (r == NULL) {

      r= new avl;

      r->d = v;

      r->l = NULL;

      r->r= NULL;

      return r;

   }

   else if (v< r->d) {

      r->l= insert(r->l, v);

      r = balance(r);

   }

   else if (v >= r->d) {

      r->r= insert(r->r, v);

      r = balance(r);

   }

   return r;

}

void avl_tree::show(avl *p, int l) {

   int i;

   if (p != NULL) {

      show(p->r, l+ 1);

      cout<<" ";

      if (p == r)

         cout << "Root -> ";

      for (i = 0; i < l&& p != r; i++)

         cout << " ";

      cout << p->d;

      show(p->l, l + 1);

   }

}

void avl_tree::inorder(avl *t) {

   if (t == NULL)

      return;

   inorder(t->l);

   cout << t->d << " ";

   inorder(t->r);

}

void avl_tree::preorder(avl *t) {

   if (t == NULL)

      return;

   cout << t->d << " ";

   preorder(t->l);

   preorder(t->r);

}

void avl_tree::postorder(avl *t) {

   if (t == NULL)

      return;

   postorder(t ->l);

   postorder(t ->r);

   cout << t->d << " ";

}

int main() {

   int c, i;

   avl_tree avl;

   while (1) {

      cout << "1.Insert Element into the tree" << endl;

      cout << "2.show Balanced AVL Tree" << endl;

      cout << "3.InOrder traversal" << endl;

      cout << "4.PreOrder traversal" << endl;

      cout << "5.PostOrder traversal" << endl;

      cout << "6.Exit" << endl;

      cout << "输入您的选择: ";

      cin >> c;

      switch (c) {

         case 1:

            cout << "输入要插入的值: ";

            cin >> i;

            r= avl.insert(r, i);

         break;

         case 2:

            if (r == NULL) {

               cout << "Tree is Empty" << endl;

               continue;

            }

            cout << "平衡 AVL 树:" << endl;

            avl.show(r, 1);

            cout<<endl;

         break;

         case 3:

            cout << "中序遍历:" << endl;

            avl.inorder(r);

            cout << endl;

         break;

         case 4:

            cout << "预序遍历:" << endl;

            avl.preorder(r);

            cout << endl;

         break;

         case 5:

            cout << "后序遍历:" << endl;

            avl.postorder(r);

            cout << endl;

         break;

         case 6:

            exit(1);

         break;

         default:

         cout << "Wrong Choice" << endl;

      }

   }

   return 0;

}

输出结果
1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 13

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 10

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 15

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 5

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 11

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 4

Left-Left Rotation1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 8

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 16

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 3

中序遍历:

4 5 8 10 11 13 15 16

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 4

预序遍历:

10 5 4 8 13 11 15 16

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 5

后序遍历:

4 8 5 11 16 15 13 10

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 14

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 3

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 7

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 9

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 1

输入要插入的值: 52

Right-Right Rotation

1.Insert Element into the tree

2.show Balanced AVL Tree

3.InOrder traversal

4.PreOrder traversal

5.PostOrder traversal

6.Exit

输入您的选择: 6

以上是 在二叉搜索树上执行右旋转的 C++ 程序 的全部内容, 来源链接: utcz.com/z/343846.html

回到顶部