试图在c++中将树转换为列表
trying to convert a tree to a list in c++
我正在尝试将树转换为列表排序器。这是我目前掌握的代码。
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
class Tree{
public:
Tree(): root(nullptr), list(nullptr){
}
~Tree(){
delete_postorder( root); root = nullptr;
delete list; list = nullptr;
}
void add(int d){
if (root==nullptr)
root = new Node(d);
else
add_inorder(root, d);
}
friend ostream& operator <<( ostream& o, Tree& t){
o << "Inorder traversal: ";
t.print_inorder(o, t.root);
o << endl;
return o;
}
void convert_to_list( ostream& o ){
o << "Converting to a list ... ";
delete list; list = nullptr;
list = list_inorder( root );
/*
* Print list
*/
for (LNode* p = list; p != nullptr; p=p->next)
o << p->data << " ";
o << " done!" << endl;
}
private:
class Node{
public:
Node(int d): data(d), left(nullptr), right(nullptr) {
}
~Node() {
delete left; left = nullptr;
delete right; right = nullptr;
}
int data;
Node* left;
Node* right;
};
Node* root;
void add_inorder(Node* t, int d){
if (d <= t->data)
if (t->left == nullptr)
t->left = new Node(d);
else add_inorder(t->left, d);
else
if (t->right == nullptr)
t->right = new Node(d);
else add_inorder(t->right, d);
}
void print_inorder( ostream& o, Node*t ){
if (t==nullptr)
return;
print_inorder(o, t->left);
o << t->data << " ";
print_inorder(o, t->right);
}
void delete_postorder(Node* t){
if (t== nullptr)
return;
delete_postorder( t->left );
t->left = nullptr;
delete_postorder( t->right );
t->right = nullptr;
delete t; t=nullptr;
}
class LNode{
public:
int data;
LNode* next;
LNode(int d): data(d), next(nullptr){
}
~LNode(){
delete next; next = nullptr;
}
void append(int d){
LNode* p = this;
for (; p->next != nullptr; p=p->next)
;
p->next = new LNode( d );
}
};
LNode* list;
LNode* list_inorder(Node* t){
if (t==nullptr)
return nullptr;
LNode* left = list_inorder( t-> left );
LNode* right = list_inorder( t->right );
if (left == nullptr)
return right;
if (right == nullptr)
return left;
/*
* Find last node in "left" and append right to it.
*/
LNode* p = left;
for (; p->next != nullptr; p=p->next) ;
p->next = right;
return left;
}
/* void list_inorder(Node* t){
if (t==nullptr)
return;
list_inorder( t-> left );
if (list==nullptr)
list = new LNode( t->data );
else
list->append(t->data);
list_inorder( t->right );
}
*/
};
int main(){
Tree t;
int data[] = { -2, 3, 10, -21, 35, 3, 85, -2, 100};
for (int i=0; i<9; i++)
t.add( data[i] );p
cout << t << endl;
t.convert_to_list( cout );
cout << "Done!";
}
带注释的list_inorder是一种递归方式,可以将树转换为列表,并且它很有效。另一个list_inorder方法(未注释的方法(是我正在处理的方法。由于某种原因,另一个list _inorder不起作用。我正在尝试返回指向转换列表中第一个节点的指针。因此,我可以运行该列表,并在convert_to_list方法中打印出元素。
感谢您的帮助。非常感谢。
您需要稍微更改一下逻辑,因为您不会返回任何值。通过按如下方式更改if语句,可以使递归调用正确退出。(另外,更改在转换函数list_inorder( root );
中的调用方式(
void list_inorder(Node* t){
if (t!=nullptr)
{
list_inorder( t->left );
if (list == nullptr)
list = new LNode( t->data );
else
list->append(t->data);
list_inorder( t->right );
}
}
订单遍历:-21-2-2 3 3 10 35 85 100正在转换为列表-21-2-2 3 3 10 35 85 100完成!完成!
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 无法从"初始值设定项列表"转换为模板<int>
- 将 lambda 函数转换为具有混合 lambda 引入器和参数列表的函子结构
- 传递可变参数时在成员初始值设定项列表中强制转换
- C++中有向无环图的邻接列表到邻接矩阵的转换
- C++列表初始化允许多个用户定义的转换
- 类型映射资源并将列表转换为矢量(并返回)
- 函数获取参数的变量列表并将它们转换为一系列字节?
- 从 std::vector<double> 到 Python 列表的转换失败(提升 python)
- 在初始值设定项列表中强制转换shared_ptr
- 将 std::list of structs 转换为 Python 列表
- 标准::列表转换和复制
- 如何在逗号分开列表中解析字段并将其转换为整数
- 错误 C2440:"正在初始化":无法从"初始值设定项列表"转换为"std::vector<char *,std::分配器<_Ty>>
- 如何将任何值转换为字节数组并将其附加到字节列表
- 解析SVG转换属性的转换列表
- 最好强制转换列表中的一个元素,或者使用指向它的指针