2012-07-08 6 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' -edit- 문제는 'ITR'변수를 사용하는 것입니다. 로컬 변수를 사용하거나 루트에 대한 포인터를 변경하지 않고도이 작업을 수행 할 수있는 방법을 모르겠습니다.

미리 감사드립니다.

답변

1

삽입 루틴은 노드를 루트에 삽입합니다. itr 이후

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

로컬 변수, 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 코드 인 것 같습니다. Be 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; 
} 
관련 문제