回溯是用試錯的思想,它嘗試分步的去解決一個問題。深度優先回溯是指在樹或圖的回溯中,沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個進程反覆進行直到所有節點都被訪問為止或已經找到有效的解答。
基本介紹
- 中文名:深度優先回溯
- 外文名:Depth-First backtracking
- 學科:計算機
- 定義:沿一個深度優先嘗試解決問題
- 有關術語:回溯法
- 領域:算法套用
回溯法
有關解釋
二類常見的解空間樹:
問題的解空間
深度優先搜尋
struct Node { int self; //數據 Node *left; //左節點 Node *right; //右節點 };const int TREE_SIZE = 9;std::stack<Node*> unvisited; Node nodes[TREE_SIZE]; Node* current;//初始化樹for(int i=0; i<TREE_SIZE; i++){ nodes[i].self = i; int child = i*2+1; if(child<TREE_SIZE) // Left child nodes[i].left = &nodes[child]; else nodes[i].left = NULL; child++; if(child<TREE_SIZE) // Right child nodes[i].right = &nodes[child]; else nodes[i].right = NULL;} unvisited.push(&nodes[0]); //先把0放入UNVISITED stack// 只有UNVISITED不空while(!unvisited.empty()){ current=(unvisited.top()); //當前應該訪問的 unvisited.pop(); if(current->right!=NULL) unvisited.push(current->right); // 把右邊壓入 因為右邊的訪問次序是在左邊之後 if(current->left!=NULL) unvisited.push(current->left); cout<<current->self<<endl;}