簡體   English   中英

c ++迭代地銷毀二叉樹

[英]c++ iteratively destroying a binary tree

我試圖編寫一個迭代破壞二叉樹的代碼。 我知道遞歸更容易,但我想我會嘗試迭代地做(雖然主要使用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;

}

我不知道我的邏輯有什么問題。 它是這樣的。 遍歷二叉樹,直到我們命中沒有子節點的節點,然后刪除該節點。 重復,直到我們只有原始父節點。 然后最后刪除。

編輯:我已經更改了代碼以響應建議。 它現在似乎工作並且沒有無限循環,但是當我嘗試打印出二叉樹的內容時,該函數會陷入無限循環。 我知道我的打印功能是正確的,所以這個delete_tree函數仍然有問題。

一個錯誤在這里:

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

當節點有兩個孩子時,你只是向下迭代。 你想檢查一下|| 而不是&&

我會用一堆指向節點的指針來做。 有人喜歡這樣:

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM