簡體   English   中英

深度優先搜索過早終止

[英]Depth-First-Search terminating prematurely

這個問題中,我問了一些有關實現自己的圖形創建數據結構的問題。 現在它終於可以工作了,我正在實現基本的DFS和BFS。 我的BFS正在使用我自己創建的隊列類。 但是,我的DFS無法正常工作,而且我似乎無法弄清楚原因。 它僅在第一個節點開始並找到第一個相鄰節點(“ USA”)時有效。 任何其他組合都將返回NULL指針(因此不會出現“實際”運行時錯誤)。 下面是代碼,在這里我刪除了不相關的例程和已經正常工作的內容。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

template<class T>
class Node{
    T data;
    vector<Node<T>*> adjacent;
    public:
        bool visited;
        int n;
        Node(T initData) : data(initData), visited(false),n(0){}
        void addAdjacent(Node<T>& other){//call from within GraphCl class. push_back in adjacent}
        T getData(){return data;}
        Node<T>* getEdge(int edgeNum){return adjacent[edgeNum];}
};

template<class T>
class GraphCl{
    int n;
    vector<Node<T>*> nodes;
    public:
        GraphCl(int size=0): n(size) {//[...]}
        ~GraphCl(){//[...]}
    void addNode(T input){//push_back new node to nodes vector}
    void addEdge(int baseNode, int edgeNode){//push_back edgeNode adres in adjacent vector}
    Node<T>* getNodeAddress(int idx){return nodes[idx];}
};

template<class T>
Node<T>* dfs(Node<T>* rootNode, T key){
    if(rootNode->visited == false){
        rootNode->visited = true;
        if (rootNode->getData() == key){
            return rootNode;
        }
        for(int i=0;i<rootNode->n;i++){
            if(dfs(rootNode->getEdge(i),key) != NULL){
                return dfs(rootNode->getEdge(i),key);
            }
        }
    }
    return NULL;
}

int main(){
    GraphCl<string> *myGraph = new GraphCl<string>();
    myGraph->addNode("USA");//0
    myGraph->addNode("Australia");//1
    myGraph->addNode("The_Netherlands");//2
    //more nodes added here ...
    myGraph->addNode("Indonesia");
    myGraph->addNode("Canada");
    myGraph->addNode("Czech_Republic");
    myGraph->addEdge(0,1);
    myGraph->addEdge(0,4);
    myGraph->addEdge(2,10);
    //more edges added here ...
    myGraph->addEdge(3,1);
    myGraph->addEdge(11,12);
    myGraph->addEdge(6,11);
    Node<string> *rootNode = myGraph->getNodeAddress(4);
    cout << dfs<string>(rootNode, "USA")->getData();
    return 0;
}

DFS功能是否存在可以立即發現的嚴重錯誤? 無法弄清楚。

這就是問題 :

if(dfs(rootNode->getEdge(i),key) != NULL){
                return dfs(rootNode->getEdge(i),key);
            }

您在同一節點上兩次調用dfs 第二次調用它時, rootNode->visited將為true。 在這種情況下,您的代碼將返回NULL 要修復它,請將if塊更改為

Node<T>* val = dfs(rootNode->getEdge(i),key);
if(val != NULL){
                    return val;
                }

暫無
暫無

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

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