2012-07-08 132 views
0
//binary_tree.h file 
typedef struct node node; 

struct node 
{ node():left(0), right(0), value(-1){}; 
    ~node(){if(left) delete left; if(right) delete right;}; 
    node *left; 
    node *right; 
    int value; 
}; 

inline void insert_node(node **root, node *new_node) 
{ 
    assert(new_node != NULL); 
    if(*root == NULL) 
    { 
     *root = new_node; 
    } 
    else 
    { 
     node *itr = *root; 
     while(1) 
     { 
      if(itr->value > new_node->value) 
       itr = itr->left; 
      else 
       itr = itr->right; 
      if(!itr) 
      { 
       itr = new_node; 
       break; 
      } 
     } 
    } 
} 

inline void inorder_print(node *root) 
{ 
    if(!root) return; 
    inorder_print(root->left); 
    printf("%d\n", root->value); 
    inorder_print(root->right); 
} 

//main.cpp file 
#include "binary_tree.h" 

int main() 
{ 
    node *node1 = new node(); 
    node *node2 = new node(); 
    node *node3 = new node(); 
    node *node4 = new node(); 
    node *node5 = new node(); 

    node1->value = 5; 
    node2->value = 10; 
    node3->value = 3; 
    node4->value = 1; 
    node5->value = 4; 

    node *binary_tree = NULL; 

    insert_node(&binary_tree, node1); 
    insert_node(&binary_tree, node2); 
    insert_node(&binary_tree, node3); 
    insert_node(&binary_tree, node4); 
    insert_node(&binary_tree, node5); 

    assert(binary_tree != NULL); 
    inorder_print(binary_tree); 

    return 0; 
} 

我有一個非常簡單的程序,我想創建一個二叉樹並打印樹。下面顯示的代碼段不會更改樹結構。指針通過指針不起作用

 node *itr = *root; 
     while(1) 
     { 
      if(itr->value > new_node->value) 
       itr = itr->left; 
      else 
       itr = itr->right; 
      if(!itr) 
      { 
       itr = new_node; 
       break; 
      } 
     } 

inorder_print函數總是打印 '5' CNC中 的問題是使用 'ITR' 變量。 我真的不知道如何在不使用局部變量的情況下做到這一點,也不會改變指向根的指針。

在此先感謝。

回答

1

您的插入例程只會將一個節點插入到根中。

 if(!itr) 
     { 
      itr = new_node; 
      break; 
     } 

由於itr是一個局部變量,new_node實際上並沒有得到插入。您可以通過將itr指向指向根的指針來更正此問題。

node **itr = root; 
    while(1) 
    { 
     if((*itr)->value > new_node->value) 
      itr = &(*itr)->left; 
     else 
      itr = &(*itr)->right; 
     if(!*itr) 
     { 
      *itr = new_node; 
      break; 
     } 
    } 
1

使用std :: set。你的代碼似乎是舊的C代碼。 C++:

#include <set> 
#include <iostream> 

int main() 
{ 
    std::set<int> binary_tree; 
    binary_tree.insert(5); 
    binary_tree.insert(10); 
    binary_tree.insert(3); 
    binary_tree.insert(1); 
    binary_tree.insert(4); 

    //inorder_print(binary_tree); 
    for (std::set<int> i = binary_tree.begin(); i != binary_tree.end(); ++i) 
     std::cout << *i << std::endl; 
}