#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 函数应该构造树。 打印功能应该按顺序打印树。
存在以下问题:
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;
}