【问题标题】:In order traversal of a left threaded BST falls into infinty loop为了遍历左线程 BST 陷入无限循环
【发布时间】: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-&gt;right-&gt;leftroot。那不是树,而是循环图。另外,root-&gt;left 是空的,但 root-&gt;lthread 是非空的,所以线程可能也被破坏了(尽管这可能在某种程度上是对坏树的准确线程......)。因此,您的错误很可能在创建树的代码中——您没有向我们展示的代码,因此我们无法调试它。
  • @abarnert 我实际上完成了我的解释;)

标签: c++ data-structures binary-search-tree


【解决方案1】:

看这段代码:

            q->right = p;
            p->left = q;

每当您将节点p 放置为现有节点q 的右子节点时,您将设置p-&gt;left 指向其父节点q,而不是其左子树(它只是空)。所以你结束了一个循环:从q 向右走,你到达p,然后从p 向左走,你又到达q。所以你的树不是一棵树,当你试着像它一样走路时,你最终会永远在那个循环中走动。

当然,这可能不是您的代码中唯一的错误,但它是导致您所询问的错误的错误。

【讨论】:

    【解决方案2】:

    我通过将if(p-&gt;left) 编辑为if (!p-&gt;lthread) 修复了中序遍历方法,并且修复成功:)

    void InOrder(thnode *root) {
    thnode *p = root;
    if (!p->lthread)
        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);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2015-02-07
      • 2015-03-27
      相关资源
      最近更新 更多