2011-09-28 67 views
4

我在构建二叉树时遇到了一个相当混乱的问题。显然这应该是一个简单的任务,但不知何故,我可能会搞砸它的指针。二叉搜索树不起作用

下面是简化的代码(当然这不是真正的代码):

#include <string.h> 
#include <iostream> 

using namespace std; 

#define DIM1 2 

typedef enum {LEFT,RIGHT} direction; 
typedef char tName[MAX_NAME_LEN + 1]; 

struct Rectangle { 
    tName _name; 
    struct Rectangle *_binSon[DIM1];    
}; 

struct Rectangle *recTree; 

void insertRectToTree(char str[]){ 
    struct Rectangle rect; 
    struct Rectangle *point; 
    struct Rectangle *parent; 
    strcpy(rect._name,str); 
    rect._binSon[RIGHT] = NULL; 
    rect._binSon[LEFT] = NULL; 
    point = &rect; 
    if (recTree == NULL){ 
     recTree = point; 
    } else { 
     struct Rectangle *current; 
     current = recTree; 
     while (current){ 
      parent = current; 
      if (strcmp(point -> _name, current -> _name) > 0){ 
       current = current -> _binSon[RIGHT]; 
      } else { 
       current = current -> _binSon[LEFT]; 
      } 
     } 
     if (strcmp(point -> _name, parent -> _name) < 0){ 
      parent -> _binSon[LEFT] = point; 
     } else { 
      parent -> _binSon[RIGHT] = point; 
     } 
     } 
    } 

int main(){ 
    recTree = NULL; 
    char str[] = "LIKE"; 
    insertRectToTree(str); 
    char str2[] = "GUIDE"; 
    insertRectToTree(str2); 
    printf(recTree -> _name); 
    return 0; 
} 

正如你所看到的,这个二叉树尝试基于它的名字来组织的记录,所以最小的字母顺序将去到左侧等等。

问题是,在第一次插入“LIKE”之后,我想把“GUIDE”插入到树中,并且仍然以“LIKE”作为根。但是,printf()显示“GUIDE”作为其根。 (换句话说,“GUIDE”是输出)。对此有什么好的解释?问我是否需要为这个问题添加更多的东西。感谢您所有的帮助。

+0

是语言C++或C? –

+0

这是C++,但我敢打赌,它适用于C以及因为我不使用任何类 – vandershraaf

+0

为什么你把关键字结构放在这一行“struct Rectangle * current;” –

回答

4

在以下行

struct Rectangle rect; 
... 
point = &rect; 
... 
recTree = point; 

分配给一个局部变量的引用,一个全球性的指针。离开函数后,它可能不再包含有效数据。

+0

这是真的。你有什么解决方法吗?我有点老实地指着指针 – vandershraaf

+0

@vandershraaf使用'point = new struct Rectangle;'以后'point - > _binSon [RIGHT] = NULL; ...'完全摆脱'rect'。 – Howard

+0

我没有使用[new struct Rectangle],而是使用[new Rectangle]。顺便说一句,谢谢你的回应。这是最好的答案,因为我不知道 – vandershraaf

1

霍华德是正确的。但要纠正这个问题,请使用新的。

的即代替 point = &rect;

point = new struct Rectangle;

+0

之前的真正问题,我试过这个,但它有错误。有没有其他的解决方法? – vandershraaf

+0

我试过这个,但[point = new Rectangle]效果更好。尽管如此,我为你的见解付出了努力 – vandershraaf