0
我的程序目標是使用深度優先搜索搜索具有給定鍵的樹節點,並且如果找到具有該鍵的節點,它將返回給調用者函數。問題是,在DFS執行後訪問節點會終止帶有分段錯誤的程序,正好在搜索右側子樹中的節點時,而不是在左側子樹上搜索時終止。C++中的DFS:返回節點(如果它包含搜索鍵)
這是源代碼:
#include <iostream>
using namespace std;
struct node
char data;
struct node *left;
struct node *right;
};
struct node *root = nullptr;
struct node* addNewNode(char newData) {
struct node* newNode = new node;
newNode->data = newData;
newNode->left = nullptr;
newNode->right = nullptr;
return newNode;
}
struct node* preOrder(struct node *srcNode, char key) {
if (srcNode != nullptr) {
if (srcNode->data == key)
return srcNode;
return preOrder(srcNode->left, key);
return preOrder(srcNode->right, key);
}
}
int main() {
root = addNewNode('a');
root->left = addNewNode('e');
root->right = addNewNode('c');
root->left->left = addNewNode('h');
root->left->right = addNewNode('z');
struct node* res = preOrder(root, 'c');
cout << res->data;
return 0;
}
好的,它是有道理的,右子樹上的第二個preOrder永遠不會被調用,但在哪裏檢查左子樹是否返回nullptr? – ner0x652 2015-03-03 06:55:07
不是立即返回左子樹的結果,而是將其存儲在局部變量中。然後,如果變量不是'nullptr',則返回它,否則請按照您現在正在執行的操作檢查正確的子樹。 – 2015-03-03 07:17:58
我認爲一個簡單的方法來找到節點是有一個節點類型的全局變量*(例如res)和preOrder if(srcNode-> data == key)then res = srcNode。然後preOrder調用不需要被返回。 – ner0x652 2015-03-03 07:19:07