【问题标题】:I m not getting correct output for pre and post order我没有得到前后订单的正确输出
【发布时间】:2021-09-01 11:03:36
【问题描述】:

// 在这段代码中,我首先创建了节点,将它们存储在一个队列中,并在我输入它们的左右子节点时继续删除它们。为了使节点不再有子节点,我在输入数据时输入了 -1。在这里,我无法理解我的代码有什么问题,我得到错误的前序和后序遍历输出。如果你们能帮助我,那就太好了。

我为队列 ds 做了一个类 que,并在保护模式下的树类中继承它。

#include <iostream>
    #include <math.h>
    using namespace std;
    struct node
    {
        int data;
        struct node *left;
        struct node *right;
    };
    class que
    {
    protected:
        int start;
        int end;
        struct node **arr;
        int n;
    
    public:
        que(int x)
        {
            n = x;
            arr = new struct node *[n];
            start = -1;
            end = -1;
        }
        void isfull()
        {
            if (end == n)
                cout << "Queue is full !!!" << endl;
            return;
        }
        int isempty()
        {
            if (start == end)
            {
                start = -1;
                end = -1;
                cout << "Queue is empty !!!" << endl;
                return 1;
            }
            return 0;
        }
        void enqu(struct node *x)
        {
            if (end == n)
            {
                cout << "called" << endl;
                isfull();
                return;
            }
            end++;
            arr[end] = x;
        }
        struct node *dequ(void)
        {
            struct node *q = 0;
            if (start == end)
            {
                isempty();
                return q;
            }
            start++;
            cout << "Element removed is ->" << arr[start] << endl;
            return arr[start];
        }
    };
    class tree : protected que
    {
    
    public:
        struct node *head;
        struct node *ptr;
        tree(int n) : que(n)
        {
            head = 0;
            ptr = 0;
            enter();
        }
        void create(void)
        {
            ptr = new struct node;
            ptr->left = 0;
            ptr->right = 0;
        }
        void enter(void)
        {
            struct node *p;
            if (head == 0)
            {
                create();
                cout << "Enter root element of tree -> ";
                cin >> ptr->data;
                head = ptr;
                cout << "Enquing ptr - " << ptr << endl;
                enqu(ptr);
            }
            while (!isempty())
            {
                p = dequ();
                cout << "Enter left child ->";
                int x;
                cin >> x;
                if (x != -1)
                {
                    create();
                    p->left = ptr;
                    ptr->data = x;
                    cout << "Enquing ptr - " << ptr << endl;
                    enqu(ptr);
                }
                cout << "Enter right child ->";
                cin >> x;
                if (x != -1)
                {
                    create();
                    p->right = ptr;
                    ptr->data = x;
                    cout << "Enquing ptr - " << ptr << endl;
                    enqu(ptr);
                }
            }
        }
        void inorder(struct node *yes)
        {
            if (yes != 0)
            {
                inorder(yes->left);
                cout << "--> " << yes->data << endl;
                inorder(yes->right);
            }
        }
        void preorder(struct node *yes)
        {
            if (yes != 0)
            {
                cout << "--> " << yes->data << endl;
                inorder(yes->left);
                inorder(yes->right);
            }
        }
        void postorder(struct node *yes)
        {
            if (yes != 0)
            {
                inorder(yes->left);
                inorder(yes->right);
                cout << "--> " << yes->data << endl;
            }
        }
        int count(struct node *yes)
        {
    
            static int x = 0, y = 0;
            if (yes == 0)
                return 0;
            x = count(yes->left);
            y = count(yes->right);
            return x + y + 1;
        }
        int height(struct node *yes)
        {
            static int a = 0, b = 0;
            if (yes == 0)
                return 0;
            a = count(yes->left);
            b = count(yes->right);
            if (a > b)
                return a + 1;
            else
                return b + 1;
        }
    };
    int main()
    {
        int x;
        cout << "Enter height of tree - ";
        cin >> x;
        int max = 0;
        max = pow(2, x + 1) - 1;
        tree tr(max);
        cout << "Preorder traversal -- " << endl;
        tr.preorder(tr.head);
        cout << "Inorder traversal -- " << endl;
        tr.inorder(tr.head);
        cout << "Postorder traversal -- " << endl;
        tr.postorder(tr.head);
        cout << "\n No. of elements -- " << tr.count(tr.head);
        cout << "\n Height of tree --" << tr.height(tr.head);
    }

【问题讨论】:

  • 请注意:似乎有些 C 主义已潜入您的代码中。 1) #include &lt;cmath&gt; 不是 math.h。 2)new node - 不是new struct node。 3) 不带参数的函数不需要将参数设为(void) - 只需将其设为空即可。
  • 类构造函数应该小而简单,并且只将成员变量初始化为已知状态。它不应该真的继续要求用户输入。相反,您应该将构造和输入分开。
  • 我怀疑你的遍历函数中涉及了一点复制粘贴编程。
  • 尝试多次使用countheight函数,发现更多bug。 (你为什么要做局部变量static?)
  • 顺便说一句:pow 在整数上下文中不好用。

标签: c++ data-structures tree tree-traversal


【解决方案1】:

preorderpostorder 函数不会递归调用自身。相反,他们调用inorder 函数,这将导致除根以外的所有内容都将使用inorder 打印。

【讨论】:

  • 哦,我太笨了,非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多