簡體   English   中英

C++中的DFS實現

[英]DFS implementation in C++

我寫了下面的代碼。 但是我不確定我是否正確插入了我的樹。 代碼編譯成功,但我沒有得到 output 中的 DFS 遍歷數組。有人能告訴我哪里出錯了嗎?

輸入樹在下面,但如果我在主 function 中進行了正確的調用,請告訴我? 因為我的 output 即將到來 - [ab c defghijk]。 而正確的 output 應該是 [abefij c dgkh]。

    A
  / \ \
 B   C D
/ \   / \
E  F  G  H
 / \  \
I  J  K
#include <bits/stdc++.h>
using namespace std;

class Node
{
    public:
      string name;
      vector <Node *> children;

      Node(string name)
      {
          this->name = name;
      }

      //O(v+e) time | O(v) space
      vector <string> depthFirstSearch(vector<string> *array)
      {
          array->push_back(this->name);
          for(size_t i = 0; i < this->children.size(); i++)
               children[i]->depthFirstSearch(array);


          return *array;
      }

      Node *addChild(string name)
      {
          Node *child = new Node(name);
          children.push_back(child);
          return this;
      }
};

int main()
{
    Node n1("a");



    n1.addChild("b");
    n1.addChild("c");
    n1.addChild("d");
    n1.children[0]->addChild("e");
    n1.children[0]->addChild("f");
    n1.children[0]->children[1]->addChild("i");
    n1.children[0]->children[1]->addChild("j");
    n1.children[2]->addChild("g");
    n1.children[2]->addChild("h");
    n1.children[2]->children[0]->addChild("k");
    vector <string> array;
    n1.depthFirstSearch(&array);




    for (size_t i = 0; i< array.size(); i++)
        cout<<array[i]<<' ';



}


注意 - 感謝您的解釋,但我對在主 function 中構建樹的方式進行了一些編輯,並繼續使用 return this 語句並且它起作用了。

該錯誤實際上很簡單,但不是預期的錯誤。

Node::addChild()返回this

      Node *addChild(string name)
      {
          Node *child = new Node(name);
          children.push_back(child);
          return this; // <-- OUCH!
      }

因此,在main()中使用時:

    Node n1("a");
    Node *n2 = n1.addChild("b"); // => n2 = &n1;
    n1.addChild("c");
    Node *n4 = n1.addChild("d"); // => n4 = &n1;
    n2->addChild("e");
    Node *n3 = n2->addChild("f"); // => n3 = n2 = &n1;
    n3->addChild("i");
    n3->addChild("j");
    Node *n5 = n4->addChild("g"); // => n5 = n4 = &n1;
    n4->addChild("h");
    n5->addChild("k");

所以,這棵樹實際上並沒有得到預期的形狀,而是類似於:

   A________________
  / \ \ \ \ \ \ \ \ \
 B   C D E F G H I J K

對於當前 output 的 OP 是完全正確的。

修復很簡單:

      Node *addChild(string name)
      {
          Node *child = new Node(name);
          children.push_back(child);
          return child;
      }

Output:

a b e f i j c d g k h 

coliru 現場演示


OP 堅持認為Node::addChild()必須return this; 並要求另一種方法來規避這個問題。 我試圖說服 OP return child; return this; .

實際上,我直覺地期望Node::addChild()會返回創建的子節點,這讓我花費了一些額外的調試時間來查找實際的錯誤。 :-)

關於

我在主 function 中構建我的樹的方式 - 這是正確的方式還是可以有更有效的方式來做到這一點

我個人認為main()中的代碼並沒有那么糟糕。

然而,通往羅馬的道路往往不止一種。

所以,這只是另一個想法:

顯式構造子節點的第二個構造函數:

      Node(Node &parent, string name): Node(name)
      {
        parent.children.push_back(this);
      }

這允許編寫樹初始化。 main()中是這樣的:

    Node nA("a");
    Node nB(nA, "b");
    Node nC(nA, "c");
    Node nD(nA, "d");
    Node nE(nB, "e");
    Node nF(nB, "f");
    Node nI(nF, "i");
    Node nJ(nF, "j");
    Node nG(nD, "g");
    Node nH(nD, "h");
    Node nK(nG, "k");

(在這種情況下甚至不使用/不需要Node::addChild() 。)

Output:

a b e f i j c d g k h 

coliru 現場演示

暫無
暫無

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

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