Функция не может быть решена - PullRequest
0 голосов
/ 13 мая 2018

У меня проблема с моим кодом C ++.Это говорит о том, что все функции, начинающиеся с isPerfectRec (), не могут быть решены ... Почему?Я много чего перепробовал, но, видимо, они не работают.У меня есть много предложений, например, чтобы проверить, является ли бинарное дерево поиска идеальным, найти второй по величине элемент в бинарном дереве поиска и т. Д.

#include <stdio.h>
#include<iostream>
#include<stack>
template<typename T> class BinarySearchTree {
    public:
        BinarySearchTree<T> *root, *left_son, *right_son, *parent;
        T *pinfo;

        BinarySearchTree() {
            left_son = right_son = NULL;
            root = this;
            pinfo = NULL;
        }

        void setInfo(T info) {
            pinfo = new T;
            *pinfo = info;
        }

        void insert(T x) {
            if (pinfo == NULL)
                setInfo(x);
            else
                insert_rec(x);
        }


        bool isPerfectRec(BinarySearchTree *root, int d, int level = 0)
        {
            // An empty tree is perfect
            if (*root == NULL)
                return true;

            // If leaf node, then its depth must be same as
            // depth of all other leaves.
            if (*root->left_son == NULL && root->*right_son == NULL)
                return (d == level+1);

            // If internal node and one child is empty
            if (root->*left_son == NULL || root->*right_son == NULL)
                return false;

            // Left and right subtrees must be perfect.
            return isPerfectRec(root->*left_son, d, level+1) &&
                   isPerfectRec(root->*right_son, d, level+1);
        }
        // Wrapper over isPerfectRec()
        bool isPerfect(BinarySearchTree *root)
        {
           int d = findADepth(root);
           return isPerfectRec(root, d);
        }
        int findADepth(BinarySearchTree *node)
        {
           int d = 0;
           while (node != NULL)
           {
              d++;
              node = node->left_son;
           }
           return d;
        }

        // A function to find 2nd largest element in a given tree.
        void secondLargestUtil(BinarySearchTree *root, int &c)
        {
            // Base cases, the second condition is important to
            // avoid unnecessary recursive calls
            if (root == NULL || c >= 2)
                return;

            // Follow reverse inorder traversal so that the
            // largest element is visited first
            secondLargestUtil(root->right_son, c);

            // Increment count of visited nodes
            c++;

            // If c becomes k now, then this is the 2nd largest
            if (c == 2)
            {
                std::cout << "2nd largest element is "
                     << root->pinfo;
                printf("\n___\n");
                return;
            }

            // Recur for left subtree
            secondLargestUtil(root->left_son, c);
        }
        void secondLargest(BinarySearchTree *root)
        {
            // Initialize count of nodes visited as 0
            int c = 0;

            // Note that c is passed by reference
            secondLargestUtil(root, c);
        }
        bool hasOnlyOneChild(int pre[], int size)
        {
            int nextDiff, lastDiff;

            for (int i=0; i<size-1; i++)
            {
                nextDiff = pre[i] - pre[i+1];
                lastDiff = pre[i] - pre[size-1];
                if (nextDiff*lastDiff < 0)
                    return false;;
            }
            return true;
        }

        BinarySearchTree * readListInter(){
            BinarySearchTree* root = NULL;//returning object
            BinarySearchTree* temp;
            BinarySearchTree* input;//new node to add
            int x;

            std::cout << "enter number (>0 to stop): ";
            std::cin >> x;
            while(x>=0){
                input = BinarySearchTree(x);
                if(root == NULL){//if root is empty
                    root = input;
                    temp = root;//temp is use to store value for compare
                }
                else{
                    temp = root; //for each new addition, must start at root to find correct spot
                    while(input != NULL){
                        if( x < temp->pinfo){//if smaller x to add to left
                            if(temp->left_son == NULL){//left is empty
                                temp->left_son = input;
                                input = NULL;//new node added, exit the loop
                            }
                            else{//if not empty set temp to subtree
                                temp = temp->left_son;//need to move left from the current position
                            }
                        }
                        else{//otherwise x add to right
                            if(temp->right_son == NULL){//right is empty
                                temp->right_son = input;
                                input = NULL;//new node added, exit the loop
                            }
                            else{
                                temp = temp->right_son;//need to move right from the current position
                            }
                        }
                    }
                }
                std::cin >> x;
            }
            return root;
        }
};

int main() {
    BinarySearchTree<int> *r = new BinarySearchTree<int>;
    BinarySearchTree<int> *r1 = new BinarySearchTree<int>;
    BinarySearchTree<int> *p = new BinarySearchTree<int>;
       p = readListInter();
    r->insert(6);
    r->insert(8);
    r->insert(1);
    r->insert(9);
    r->insert(10);
    r->insert(4);
    r->insert(13);
    r->insert(12);

    printf("\n___\n");
       r1->insert(6);
       r1->insert(8);
       r1->insert(1);
       r1->insert(9);
       r1->insert(10);
       r1->insert(4);
       r1->insert(13);
       r1->insert(12);

           printf("\n___\n");

     r->isPerfect(r);
     int pre[] = {8, 3, 5, 7, 6};
         int size = sizeof(pre)/sizeof(pre[0]);
         if (hasOnlyOneChild(pre, size) == true )
             printf("Yes");
         else
             printf("No");
s
    return 0;
}

1 Ответ

0 голосов
/ 13 мая 2018

Я думаю, вам нужно написать BinarySearchTree<T> вместо BinarySearchTree в качестве типа данных в этих функциях.

...