我的程序目标是使用深度优先搜索搜索具有给定密钥的树节点,如果找到具有该密钥的节点,则将其返回给调用者函数。问题是在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;
}
答案 0 :(得分:4)
您的preOrder
函数并不总是返回值。如果srcNode
为nullptr
,则应返回nullptr
。
你的编译器应该警告你这个!如果不是,则更改编译器设置,或者获得更好的编译器。
修改:此外 - 在尝试使用res
之前,您应检查nullptr
是否为 return preOrder(srcNode->left, key);
return preOrder(srcNode->right, key);
。
Edit2:没看到这一点
{{1}}
永远不会调用对preOrder的第二次调用(因为你已经返回),所以你永远不会搜索右手节点。您需要更改逻辑,以便在左侧搜索返回nullptr时搜索右侧节点。