Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để kiểm tra xem một cây nhị phân đầu vào có phải là cây con của cây nhị phân hay không

Cây nhị phân là cấu trúc dữ liệu dạng cây trong đó mỗi nút có nhiều nhất hai nút con, được định nghĩa là nút con bên trái và nút con bên phải.

Thuật toán

Begin
   function identical(): 
      Take two nodes r1 and r2 as parameter.
      If r1 and r2 is NULL then
         Return true.
      If r1 or r2 is NULL then
         Return false.
      Return (r1->d is equal to r2->d and
         Call function Identical(r1->l, r2->l) and
         Call functions Identical(r1->r, r2->r) );
      function Subtree(node *T, node *S) : 
         if (S == NULL) then
            return true;
         if (T == NULL) then
            return false;
         if (call function Identical(T, S))
            return true;
         return Subtree(T->l, S) or Subtree(T->r, S); 
End.


Mã mẫu

#include <iostream>
using namespace std;
struct n {
   int d;
   struct n* l;
   struct n* r;
};
bool Identical(struct n * r1, struct n *r2) {
   if (r1 == NULL && r2 == NULL)
      return true;
   if (r1 == NULL || r2 == NULL)
      return false;
      return (r1->d == r2->d && Identical(r1->l, r2->l) && Identical(r1->r, r2->r) );
}
bool Subtree(struct n *T, struct n *S) {
   if (S == NULL)
      return true;
   if (T == NULL)
      return false;
   if (Identical(T, S))
      return true;
      return Subtree(T->l, S) || Subtree(T->r, S);
}
struct n* newN(int d) {
   struct n* nod =
   (struct n*)malloc(sizeof(struct n));
   nod->d = d;
   nod->l = NULL;
   nod->r = NULL;
   return(nod);
}
int main() {
   struct n *T = newN(24);
   T->r = newN(2);
   T->r->r = newN(5);
   T->l = newN(7);
   T->l->l = newN(3);
   T->l->l->r = newN(40);
   T->l->r = newN(6);
   struct n *S = newN(20);
   S->r = newN(5);
   S->l = newN(3);
   S->l->r = newN(50);
   if (Subtree(T, S))
      cout<<"given tree is subtree of Binary tree"<<"\n";
   else
      cout<<"given tree is not subtree of Binary tree"<<"\n";
      struct n *T1 = newN(30);
      T1->r = newN(20);
      T1->r->r = newN(19);
      T1->l = newN(17);
      T1->l->l = newN(4);
      T1->l->l->r = newN(40);
      T1->l->r = newN(15);
      struct n *S1 = newN(17);
      S1->r = newN(15);
      S1->l = newN(4);
      S1->l->r = newN(40);
      if (Subtree(T1, S1))
         cout<<"given tree is subtree of Binary tree";
      else
         cout<<"given tree is not subtree of Binary tree";
         getchar();
         return 0;
}

Đầu ra

given tree is not subtree of Binary tree
given tree is subtree of Binary tree