我的二叉树创建代码不打印任何值

问题描述 投票:0回答:1
#include <iostream>
#include<bits/stdc++.h>

using namespace std;

 struct node
{
    int data;
    node* r;
    node* l;
    node(int data):data(data){};
 };

 void add(node*&root,vector<int>value,vector<char>direction)
 {
     assert(value.size()==direction.size());
     node*curr=root;
     for(int i=0;i<(int)value.size();i++)
     {
         if(direction[i]=='R')
         {
             if(curr->r)

                 assert(curr->r->data==value[i]);
             else
             {
              node*n=new node(value[i]);
               curr->r=n;
               curr=curr->r;
             }
         }
         else if(direction[i]=='L')
            {
             if(curr->l)

                 assert(curr->l->data==value[i]);
             else
             {
                node*n=new node(value[i]);
               curr->l=n;
               curr=curr->l;
             }
         }
     }

 }

  void print_inorder(node*curr)
  {
      if(!curr)
        return;
      print_inorder(curr->l);
      cout<<curr->data<<" ";
      print_inorder(curr->r);
  }

int main()
{
    node* root=new node(1);
    add(root,{2,5},{'L','R'});

    add(root,{2,4,6},{'L','L','L'});

    add(root,{3,7},{'R','R'});
    print_inorder(root);
    return 0;
}

大家好,我编写了这个 BT 代码来构造一棵树,然后打印它,但是当我运行代码时它没有打印任何值,我找不到问题,所以我非常感谢任何帮助。

add 函数应该构造树。 打印功能应该按顺序打印树。

binary-tree
1个回答
0
投票

存在以下问题:

    分配新节点时,
  • l
    r
    字段不会初始化。所以这会导致未定义的行为。

  • add
    中,当子节点已经存在时,您仍然需要移动到它,就像在
    else
    情况下一样。

其他备注:

这是更正后的代码:

#include <iostream>
// Include standard headers, not <bits/stdc++.h>
#include <vector>
#include <cassert>

// Don't do: using namespace std;

struct node
{
    int data;
    node* r = nullptr; // Initialize!
    node* l = nullptr;
    node(int data) : data(data) {};
};

void add(node* &root, std::vector<int> value, std::vector<char> direction)
{
    assert(value.size() == direction.size());
    node* curr = root;
    for (int i = 0; i < (int)value.size(); i++)
    {
        if (direction[i] == 'R')
        {
            if (curr->r)
                 assert(curr->r->data == value[i]);
            else
                curr->r = new node(value[i]);
            curr = curr->r; // Always do this
        }
        else if (direction[i] == 'L')
        {
            if (curr->l)
                 assert(curr->l->data == value[i]);
            else
                curr->l = new node(value[i]);
            curr = curr->l; // Always do this
        }
    }
}

void print_inorder(node *curr)
{
    if (!curr)
        return;
    print_inorder(curr->l);
    std::cout << curr->data << " ";
    print_inorder(curr->r);
}

int main()
{
    node* root = new node(1);
    add(root, {2, 5}, {'L', 'R'});
    add(root, {2, 4, 6}, {'L', 'L', 'L'});
    add(root, {3, 7}, {'R', 'R'});
    print_inorder(root);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.