【发布时间】:2018-05-11 16:03:32
【问题描述】:
我有一个左线程 BST,我想按顺序遍历并打印一行中每个节点的一些数据。我使用下面的方法,但它卡在第一个和第二个显示的节点之间。让我们看看代码:
void InOrder(thnode *root) {
thnode *p = root;
if (p->left)
InOrder(p->left);
cout << p->info << ",";
if (p->left) cout << p->left->info << ",";
else cout << "null,";
if (p->lthread)cout << "T" << endl;
else cout << "F" << endl;
if (p->right)
InOrder(p->right);
}
输出:
-1,null,T
0,-1,F
-1,null,T
0,-1,F
.
.
.
这是一个程序,它获取一个字符串并从字符串从左到右依次添加节点。示例输入:8,3,5,2,9,0,-1,12,1,7,23,14
主要方法使用以下方法分析输入并添加节点:
void MakeThreadedBST(int x) {
thnode *p, *q;
p = new thnode;
p->info = x;
p->left = p->right = NULL;
p->lthread = true;
if (Root == NULL) Root = p;
else {
q = Root;
while (1) {
if (p->info < q->info) {
if (q->lthread) {
p->left = q->left;
q->left = p;
q->lthread = false;
break;
} else
q = q->left;
} else {
if (!q->right) {
q->right = p;
p->left = q;
break;
} else
q = q->right;
}
}
}
}
在添加所有节点后,我调用InOrder 方法,但它只打印两个第一个节点以按我之前提到的顺序遍历树。
【问题讨论】:
-
我应该添加哪部分代码/解释?
-
使它成为 mcve 的部分;] 如果您点击链接,您会发现 mcve 是什么的解释。简而言之:这是重现错误的最少代码量。
-
从您的输出看来,
root->right->left是root。那不是树,而是循环图。另外,root->left是空的,但root->lthread是非空的,所以线程可能也被破坏了(尽管这可能在某种程度上是对坏树的准确线程......)。因此,您的错误很可能在创建树的代码中——您没有向我们展示的代码,因此我们无法调试它。 -
@abarnert 我实际上完成了我的解释;)
标签: c++ data-structures binary-search-tree