HOME ABOUT CONTACT

演算法 - 實作深度優先搜尋 (Depth-First Search)

Rain July 15, 2023
Outline

簡介

結點類別

建立樹狀結構

深度優先走訪

簡介top

我們以先前一篇演算法 - 深度優先搜尋 (Depth-First Search)的範例來實作深度優先搜尋, 並且以 C++ Standard Container Stack(堆疊) 來實作。

結點類別top

首先,我們先定義Node(節點)類別並且實現它所需的方法(Function)。


class Node {
public:
    Node(int value):m_value(value), m_mark(false){}
    ~Node() {}
    int getValue();                 //取得節點值
    stack* getNextNode();           //取得Stack m_nextNode成員
    void insertNode(Node* n);       //插入節點方法
    void setMark(bool m);           //標記節點,用以標示該節點已經被走訪過
    bool isMarked();                //確定該節點是否已被標記
private:
    int m_value;                    //類別成員: 節點值
    stack m_nextNode;               //類別成員: Stack存放連結的節點
    bool m_mark;                    //類別成員: 走訪標記
};
                    

類別定義好之後,我們接著實現類別的方法,如下:


int Node::getValue() {
    return m_value;
}
                            
stack* Node::getNextNode() {
    return &m_nextNode;
}
                            
void Node::insertNode(Node* n) {
    m_nextNode.push(n);
}
                            
void Node::setMark(bool m) {
    m_mark = m;
}
                            
bool Node::isMarked() {
    return m_mark;
}
                        

建立樹狀結構top

節點類別搞定好之後,我們依據說明範例來建立如下圖的樹狀結構。

DFS_BFS_graphic_example

void createTree(Node* root) {
    // New All of Node
    Node* node2 = new Node(2);
    Node* node3 = new Node(3);
    Node* node4 = new Node(4);
    Node* node5 = new Node(5);
    Node* node6 = new Node(6);
                            
    // Inserting Node
    root->insertNode(node2);
    root->insertNode(node3);
    root->insertNode(node4);
    node2->insertNode(node5);
    node3->insertNode(node5);
    node3->insertNode(node6);
}
                        

深度優先走訪top

樹狀結構完成後,最後就是實現DFS走訪的方法。


void visitTree(Node* node) {
    if (!node->isMarked())  //確定該節點標記是否已經被走訪過,若沒有則輸出該節點的值
        cout << node->getValue() << " " << endl;
    node->setMark(true);    //將節點標記為已走訪
    stack* nodeStack = node->getNextNode();  //取得該節點的連接節點堆疊
    if (nodeStack->empty()) //若該節點沒有連接節點,則返回
        return;
    while (!nodeStack->empty()) {   //以遞迴的方式繼續走訪連接節點
        Node* n = nodeStack->top();
        visitTree(n);
        nodeStack->pop();
    }
}

int main()
{
    Node* root = new Node(1);
    createTree(root);
    visitTree(root);

    return 0;
}
                        

最後得到的走訪輸出為: 1, 4, 3, 6, 5, 2

Last updated:

Related Artical List

  1. 演算法 - 廣度優先搜尋 (Breadth-First Search)
  2. 演算法 - 深度優先搜尋 (Depth-First Search)

Article List