2013-05-17 64 views
0

我很困惑你如何初始化m_parent指向子節點上方的節點。C++如何在二叉樹中爲父指定一個指針

class Node 
{ 
public: 
    Node(string city); 
    ~Node(); 
    string m_city; 
    int m_parent_distance; 
    Node *m_left; 
    Node *m_right; 
    Node *m_parent; 
}; 
Node *m_root; 
//void test_print(string target, Node *cur_root); 
Node * find_node(Node *m_root, string target); 

這是節點構造

Stree::Node::Node(string city) 
{ 
    m_city = city; 
    m_left = NULL; 
    m_right = NULL; 
    //what do i do with m_parent?? 
    m_parent_distance = 0; 
} 

回答

1

傳遞父作爲參數傳遞給你的構造,並從那裏初始化:

class Node 
{ 
public: 
    Node(string city, Node *parent); 
    ~Node(); 
    string m_city; 
    int m_parent_distance; 
    Node *m_left; 
    Node *m_right; 
    Node *m_parent; 
}; 

Stree::Node::Node(string city, Node *parent) 
    : m_city(city), 
     m_left(NULL), 
     m_right(NULL), 
     m_parent(parent), 
     m_parent_distance(0) 
{ 
} 

順便說一句,你應該使用初始化列表(像我上面寫的),而不是在構造函數賦值(就像你向我們展示的代碼一樣)。

+0

非常有幫助,謝謝,這讓我想起了一個事實,即我可以在創建節點本身時初始化m_parent。即m_root-> m_left =新節點(city2,m_root);你可以很容易地看到m_root成爲父母! –

0

最自然的方式可能是添加一個方法AddChild(Node * child, bool left)並調用父。這將需要:

  • 設置m_parent在孩子。
  • 在父項中設置m_leftm_right

的替代可能是一個parentleft參數添加到孩子的構造,做這些操作那裏。

0

正如其他人所提到的,您需要添加一個函數以將子項添加到節點,同時設置子項的父指針和父項的左指針或右指針,或者創建一個構造函數來設置父項明確。

但是,這是重新發明輪子。除非這是針對禁止使用標準庫的學校作業,否則您應該使用std::mapstd::set