Бинарное дерево поиска - PullRequest
0 голосов
/ 02 ноября 2018

Мне крайне нужна помощь в поиске проблемы в моем коде, я уверен, что она сужена до функции countLeaves. Я не могу заставить его распечатать, как бы я это ни изменил. Я довольно новичок в C ++, но я очень ценю все, что кто-нибудь может мне предложить! Я опубликую заголовок, функцию и основную часть в этом порядке.

#include <iostream>

//#include<stack>
//#include<queue>
#ifndef BSTFunction
#define BSTFunction
using namespace std;
typedef int num;

class Node{
public:
    num info;
    Node* left;
    Node* right;
    Node(); // Valuetype to num
    Node(num);
};

class BST{
public:
    Node* findNode(num);
    Node* findParent(num);
    Node* findrightnode(Node*);
    void inorder(Node*);
    Node* root;
    Node* curr;
    //Was public:
    BST();
    void insert(num);
    void inorderTraversal(); //was traverse
    num search();
    void custom_print();
    int countLeaves(Node* T);
};

#endif

Function.cpp

#include <iostream>
#include <queue>
#include "BSTFunction.hpp"

Node::Node(){
    left=right=NULL;
}
Node::Node(num val){
    info=val;
    left=right=NULL;
}

//constructor
BST::BST(){
    root=curr=NULL;
}
//insert a node with value val in tree
void BST::insert(num val){
    if(root==NULL)
        root = new Node(val);
    else{
        Node* p =findNode(val);
        if(p==0) {
            //cout<<"fine1";
            Node* parent=root;
            if (p != root)
                parent = findParent(val);
            if(val>parent->info) parent->right=new Node(val);
            else parent->left=new Node(val);
        }//cout<<"fine2";
    }
}
//remove the node if value is val

//fins node with a value key
Node* BST::findNode(num key){
    Node* p =root;
    while((p!=NULL)&&(p->info!=key)){
        if(key<p->info)p=p->left;
        else p=p->right;
    }
    return p;
}
//find parent of a node with value key
Node* BST::findParent(num key){
    Node* p =root;
    Node* q=0;
    while((p!=NULL)&&(p->info!=key)){
        q=p;
        if(key<p->info)p=p->left;
        else p=p->right;
    }
    return q;
}
//finds the most right of a node p(means immediate succesor of p in inorder representation)
//Node* BST::findrightnode(Node* p){
//    Node* righty=p;
//    while(righty->right!=NULL)
//        righty=righty->right;
//    return righty;
//}

void BST::inorder(Node* p){
    if(p!=NULL){
        inorder(p->left);
        cout<<p->info<<" ";
        inorder(p->right); }
}
void BST::inorderTraversal(){
    cout<<endl<<"Inorder: ";
    inorder(root);
    cout<<endl;
}

//to print tree hightwise i.e. all nodes at h1, then all nodes at h2, then at h3
void BST::custom_print(){
    //Node* temp;
    if(root==NULL)
        return;
    queue<Node*> Q;
    Q.push(root);
    //Q.push(NULL);
    while(!Q.empty()){
        curr=Q.front();
        cout<<curr<<" ";
        Q.pop();
        Q.push(curr->left);
        Q.push(curr->right);
    }
}



int BST::countLeaves(Node *T)
{
    if(T ==NULL)      //if T is empty, return0
    {
        return(0);
    }
    else if(T -> left == NULL && T-> right == NULL)      //if T has0 children, then it is a leaf
    {
        return(1);
    }
    else
    {
        return countLeaves(T -> left) + countLeaves(T -> right);  //recursive call to find more leaves

    }
}

main.cpp

#include<iostream>
#include "BSTFunction.hpp"

int main()
{
    BST leaves;
    leaves.insert(24);
    leaves.insert(43); //The code will take all of these numbers entered into the main function and put them in traversal order, much like it could under any order (post or pre) if needed. (Note to self: Not needed for this assignment)
    leaves.insert(82);
    leaves.insert(22);
    leaves.insert(12);
    leaves.insert(92);
    leaves.insert(68);
    leaves.insert(20);
    leaves.insert(4);
    cout << "These are the in order leaves for the Bianary Search Tree. " << endl;
    leaves.inorderTraversal();
    cout << "The number of leaves are: " << endl;
    leaves.countLeaves()
    //leaves.custom_print();
    return 0;
}

1 Ответ

0 голосов
/ 02 ноября 2018

Проблема в вашем коде в том, что у вас есть аргумент в вашей countLeaves() функции-

int BST::countLeaves(Node *T)

Когда вы вызываете эту функцию из основного, она не имеет аргумент для countLeaves(). Выдает ошибку, поскольку это не получить любой параметр.

Что касается решения, вам нужно создать объект Node в вашем main и отправить его в качестве аргумента. Вам придется беспокоиться о том, что и как вы собираетесь делать все это. Кажется, есть несколько ошибок как в логике, так и в синтаксисе. (Я прокомментировал ваш countLeaves() звонок, и он выдал много ошибок. Рекомендую использовать отладчик. Попробуйте напечатать значения и операторы ввода «Функция введена», чтобы упростить поиск ошибок в вашей программе, если вы не можете использовать отладчик в данный момент.

Надеюсь, это было полезно.

...