【问题标题】:c++ iteratively destroying a binary treec ++迭代地破坏二叉树
【发布时间】:2016-04-25 21:23:08
【问题描述】:

我试图编写一个迭代破坏二叉树的代码。我知道递归要容易得多,但我想我会尝试迭代地进行(尽管主要使用 C 表示法并且只使用结构,不需要类)。我的想法是这样的:

void delete_tree (node *p_tree){
node *local_node;
node *parent;
int left_or_right;
while (p_tree->p_left != NULL || p_tree->p_right != NULL){
    parent = p_tree;
    if (parent->p_left != NULL){
        local_node = parent->p_left;
        left_or_right = 1;
    } else {
        local_node = parent->p_right;
        left_or_right = 2;
    }
    while (local_node->p_left != NULL || local_node->p_right != NULL){
        if (local_node->p_left == NULL){
            parent = local_node;
            local_node = local_node->p_right;
            left_or_right = 2;
        } else if (local_node ->p_right == NULL){
            parent = local_node;
            local_node = local_node->p_left;
            left_or_right = 1;
        } else {
            parent = local_node;
            local_node = local_node->p_left;
            left_or_right = 1;
        }
    }
    cout << "Deleting node with value: " << local_node->key_value << endl;
    delete local_node;
    local_node = NULL;
    if (left_or_right == 1){
        parent->p_left = NULL;
    } else if (left_or_right == 2){
        parent->p_right = NULL;
    }
}
cout << "Deleting node with value: " << p_tree->key_value << endl;
delete p_tree;
p_tree = NULL;

}

我不知道我的逻辑有什么问题。它是这样的。向下遍历二叉树,直到找到一个没有子节点的节点,然后删除该节点。重复直到我们只有原始的父节点。然后最后删除。

编辑:我已根据建议更改了代码。它现在似乎可以工作并且没有无限循环,但是当我尝试打印出二叉树的内容时,该函数陷入了无限循环。我知道我的 print 函数是正确的,所以这个 delete_tree 函数肯定还是有问题。

【问题讨论】:

    标签: c++ binary-tree


    【解决方案1】:

    这里有一个错误:

    while (local_node->p_left != NULL && local_node->p_left != NULL)
    

    当节点有两个孩子时,您只会向下迭代。你想检查|| 而不是&amp;&amp;。

    【讨论】:

    • 其中一个也应该说p_right。尽管如此,里面的逻辑还是被打破了——它应该避免到目前为止local_node被设置为nullptr。
    • 感谢您的快速回复。我犯了一些愚蠢的错误。但是我的代码在第一次遍历后似乎仍然卡在无限循环中。
    • @Jim:释放节点时,您也没有清除父节点中的子引用,因此可能与此有关。
    • @Dolda2000。我不知道为什么我需要这样做。父节点指向 local_node,然后我将其删除并设置为 NULL。
    • @Jim:将local_node 设置为NULL 不会更改您从中读取它的父结构中的相关字段。
    【解决方案2】:

    我会用一堆指向节点的指针来做。有些是这样的:

    void preOrderStack_aux(node *p)
    {
      if (p == NULL) 
        return;
    
      stack_t stack;
    
      stack_push(p); 
    
      while (not stack_is_empty(stack))
        {
          p = stack_pop(stack);
    
          if (p->p_right != NULL)
            stack_push(p->p_right);
    
          if (LLINK(p) != NULL)
            stack_push(p->p_link);
    
          // here stack has stored descendents
          free(p);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2015-01-18
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多