我不知道如何调用参数为Node类型的函数

时间:2017-03-24 22:46:12

标签: c++ g++ binary-search-tree

我想在main()中调用此函数,但问题是我在接收Node类型参数时应该传递哪个参数 在简单中我只想看到树的高度。所以请帮助我,删除我在高度的函数调用期间遇到的错误,它需要一个Node类型参数,我不知道应该通过什么。这是整个代码

#include <iostream>
using namespace std;
// Binary Search Tree
// 
class Node 
{
    public:
           int data;
           Node *left,*right;
           Node(Node *l=NULL ,int d=0, Node *r=NULL)
           {
            left=l;
            data=d;
            right=r;
           }
};

// Binary Search Tree
class Tree
{
  Node *root;

  public :
      Tree()
      {
        root=NULL;  
      } 

      bool isEmpty()
      {
        if(root==NULL)
          return true;
        else
          return false;  
      }
      /////////////////////////////////////////////////////////////////////////////////////////////////
      //  insert funcation
      /////////////////////////////////////////////////////////////////////////////////////////////////
      void insert(int val)
      {
        if(isEmpty())
        {
            root=new Node(NULL,val,NULL);

        }
        else if(val < root->data && root->left==NULL)
        {
            Node *p=new Node(NULL ,val,NULL);
            root->left=p;
        }   
        else if(val > root->data && root->right==NULL)
        {
            Node *p=new Node (NULL ,val,NULL);
            root->right=p;
        }

        else if(val < root->data)
        insert(val ,root->left);
        else 
        insert(val ,root->right);
      }
      ////////////////////////////////////////
      void insert(int val,Node *n)
      {
         if(val>n->data && n->right==NULL)
         {
           Node *p=new Node(NULL,val,NULL);
           n->right=p;  
         }
         else if(val > n->data)
           insert(val,n->right);
         else if(val <n->data && n->left==NULL)
         {
            Node *p=new Node(NULL,val,NULL);
            n->left=p;
         }
         else
          insert(val,n->left);
      }
      //////////////////////////////////////////////////////////////////////////////////////
      //   pre Order all data display
      //////////////////////////////////////////////////////////////////////////////////////

      void preOrder(void)
      {
        if(isEmpty())
        cout<<"Tree is Empty\n";
        else
            preOrder(root);
      }
      void preOrder(Node *n)
      {
        if(n!=NULL)
         {
            cout<<n->data<<endl;
            preOrder(n->left);
            preOrder(n->right);
        }
      }
      //////////////////////////////////////////////////////////////////////////////////////
      //         in fix Order all data display
      //////////////////////////////////////////////////////////////////////////////////////
      void inOrder()
      {
        if(isEmpty())
        cout<<"Tree is Empty\n";
        else
            inOrder(root);
      }
      void inOrder(Node *n)
      {
        if(n!=NULL)
         {
            inOrder(n->left);
            cout<<n->data<<endl;
            inOrder(n->right);
        }
      }
    //////////////////////////////////////////////////////////////////////////////////////
    //    post  Order all data display
    //////////////////////////////////////////////////////////////////////////////////////

      void posOrder()
      {
        if(isEmpty())
        cout<<"Tree is Empty\n";
        else
            posOrder(root);
      }
      void posOrder(Node *n)
      {
        if(n!=NULL)
         {
            posOrder(n->left);
            posOrder(n->right);
            cout<<n->data<<endl;
        }
      } 

      /////////////////////////////////////////////////////////////////////////////////////////////////
      //                    Search funcation
      /////////////////////////////////////////////////////////////////////////////////////////////////
      void search(int val)
      {
        if(isEmpty())
                   cout<<"Tree is Empty\n";
        else
           search(val,root);
      }
      void search(int v,Node *p)
      {    
           if(v==p->data)
                  cout<<"val : "<<p->data<<endl;        
           else if(v < p->data && p->left!=NULL)
                  search(v,p->left);
           else if(v>p->data && p->right!=NULL)
                search(v,p->right);
           else 
                  cout<<"Data Not Found \n";
      } 

     Node *l;
     int deleteKey(int val)
     {
      if(isEmpty())
      cout<<"Tree is Empty\n";
      else if(root->data==val &&(root->left==NULL&&root->right==NULL))
      {
         int temp=root->data;
         delete root;
         return temp;   
      }
       else
        deleteKey(val,root);
      }

       int deleteKey(int v,Node *p)
      {  
           if(v == p->data)  
             {

                  if(p->left==NULL && p->right==NULL)
                  {
                    if(l->right==p)  
                    {
                      int temp=p->data;
                      delete p;
                      l->right=NULL;
                      return temp;
                    }
                     else 
                     {
                      int temp=p->data;
                      delete p;
                      l->left=NULL;
                      return temp;
                     }
                  }
                  else if(p->right!=NULL) 
                  {
                      int temp=p->data;
                     deleteKey(p,p->right);
                     return temp;
                  }
                  else  
                  {
                    int temp=p->data;
                        cout<<"Left : "<<p->data<<endl;
                    deleteKey(p,p->left,v);
                    return temp;
                  }
             }
           else if(v < p->data && p->left!=NULL)
           {
                  l=p;
                  deleteKey(v,p->left);
           }
           else if(v>p->data &&p->right!=NULL)
           {    
                  l=p; 
                deleteKey(v,p->right);
           }
           else 
                  cout<<"Data Not Found ----\n";
      }

       int deleteKey(Node *find ,Node *next)
      {
            if( next->left == NULL && next->right != NULL ) 
            {
                find->data = next->data;
                deleteKey(find->right , next->right);
            }
            else if( next->left == NULL&& next->right==NULL)
            {
                find->data = next->data;
                delete next;
                find->right=NULL;
            }
            else  
            {
                Node *q;
                while(next->left!=NULL)
                {
                   q=next;  
                   next=next->left;
                 }
                 find->data=next->data;
                 delete next;
                 q->left=NULL;  
             }
      }
          int deleteKey(Node* find,Node *next,int v)
      {
            if( next->right == NULL && next->left != NULL ) 
            {
                find->data = next->data;
                deleteKey(find->left , next->left,v);
            }
            else if( next->right == NULL&& next->left==NULL)
            {
                find->data = next->data;
                delete next;
                find->left=NULL;
            }
            else 
            {
                Node *q;
                while(next->right!=NULL)
                {
                   q=next;  
                   next=next->right;
                 }
                 find->data=next->data;
                 delete next;
                 q->right=NULL; 
             }
      }

       ~Tree()
       {
         dist();
       }

             void dist()
             {
                dist(root);
             }
              void dist(Node *n)
              {
                if(n!=NULL)
                {
                     dist(n->left);
                     dist(n->right);
                     delete n;
               }
             }
             int height(Node *root)
             {
                int h=0;
                if (isEmpty())
                {
                    cout<<"Tree is Empty\n";    
                }
                else
                {
                    int left_height=height(root->left);
                    int right_height=height(root->right);
                    h=1+max(left_height, right_height);

                }
                return h;
             }

};

int main()
{
    Tree obj;
    obj.height();   
}

1 个答案:

答案 0 :(得分:1)

你必须在这个函数中传递你的树的根,但更好的方法是如果你再创建一个没有任何参数的函数并将该函数公开并通过传递这个来调用你的私有函数 - > ;根;

在这里你可以看到:

public:
int getHeight()
{
return height(this->root); //pass your Tree class root
}

并在课堂上将该功能设为私有,以提高效率。

private:
int height(Node *root)
             {
                int h=0;
                if (isEmpty())
                {
                    cout<<"Tree is Empty\n";    
                }
                else
                {
                    int left_height=height(root->left);
                    int right_height=height(root->right);
                    h=1+max(left_height, right_height);

                }
                return h;
             }

另一种方法是在类中创建一个getRoot()函数,并在main中获取Tree类的Root并传递给height函数。但第一种方法会更好。