C ++中的DFS:如果包含搜索键,则返回节点

时间:2015-03-03 06:01:48

标签: c++ algorithm tree depth-first-search

我的程序目标是使用深度优先搜索搜索具有给定密钥的树节点,如果找到具有该密钥的节点,则将其返回给调用者函数。问题是在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;
}

1 个答案:

答案 0 :(得分:4)

您的preOrder函数并不总是返回值。如果srcNodenullptr,则应返回nullptr

你的编译器应该警告你这个!如果不是,则更改编译器设置,或者获得更好的编译器。

修改:此外 - 在尝试使用res之前,您应检查nullptr是否为 return preOrder(srcNode->left, key); return preOrder(srcNode->right, key);

Edit2:没看到这一点

{{1}}

永远不会调用对preOrder的第二次调用(因为你已经返回),所以你永远不会搜索右手节点。您需要更改逻辑,以便在左侧搜索返回nullptr时搜索右侧节点。