微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用linkedlish C++检查二叉树中的2个节点是否相邻

如何解决使用linkedlish C++检查二叉树中的2个节点是否相邻

抱歉英语不好。 我正在使用 C++ 中的链表创建一个二叉树项目。我试图制作一个布尔方法来检查 2 个节点是否相邻? 我正在尝试使用递归方法,因为我正在使用链表来执行此操作,但似乎我做错了。

这是我声明节点的方式

    Struct Node{
        string name;
        int data;
        Node *right,*left;
    }

这里是我声明检查函数的方式:

bool checkadjacent(node* Node,string& u,string& v) {
    if(!Node){
        return false;
    }
    if (Node && Node->right) {
        string current = Node->name;
        string right = Node->right->name;
        if (current == u && right == v)
            return true;
        else if (current == v && right == u)
            return true;
    }
    if (Node && Node->left) {
        string current = Node->name;
        string left = Node->left->name;
        if (current == u && left == v)
            return true;
        else if (current == v && left == u)
            return true;
    }
    if (Node->left){
        if(checkadjacent(Node->left,u,v)){
            return true;
        }
    }
    if (Node->right){
        if(checkadjacent(Node->right,v)){
            return true;
        }
    }
}

解决方法

注意:“看来我做错了”并不是对您的代码如何执行的解释。始终描述您的代码应该做什么以及它实际在做什么。

话虽如此,我假设您的代码无法编译。我整理了一份(可能不全面的)代码错误和其他问题的列表,以及代码的更正版本。但是,我建议您观看一些有关 C++(或者 C,如果您愿意,因为您的代码基本上是 C 代码)的教程,因为您的代码显示出一些严重的误解和忽视。除此之外,除了以下列表中的最后一个要点之外,您的基本想法似乎是正确的。

问题列表:

  • 它是 struct 而不是 Struct(C++ 中的大小写很重要)。 (这是正确性/语法所必需的)
  • Node 的声明中,您将节点的名称大写。稍后,您将其命名为 node,而是将实例化 Node 的对象的名称大写(为了保持一致,我将结构称为 Node,它的实例化为 node)。 (这是正确性/语法所必需的)
  • 首先检查 Node 是否真的指向一个结构体:if(!Node)。这很好,但以后无需再次检查相同的内容:if (Node && Node->right)if (Node && Node->left) 只需省略两个条件中的第一部分:if (node->right)if (node->left)。 (这是为了风格)
  • 然后你也可以省略第三和第四个 if 语句,并将它们的块分别放入第一和第二个 if 块。 (这是为了风格)
  • 不要在 if 块中声明变量 currentrightleft,而是在函数的开头声明它们。 (这是为了风格)
  • 为了使算法工作,如果没有执行任何 if 语句,则必须返回 false(这是一个猜测;我没有对此进行测试,您必须自己尝试)。 (这是正确性/语义所必需的)

这是完整的代码(请注意,我没有测试了这段代码,因为您的问题显然是语法错误而不是算法设计。

bool checkadjacent(Node* node,string& u,string& v) {
    string current,left,right;

    if (!node) {
        return false;
    }
    if (node->right) {
        current = node->name;
        right = node->right->name;
        if (current == u && right == v)
            return true;
        else if (current == v && right == u)
            return true;

        // recursion
        if (checkadjacent(node->right,u,v)) {
            return true;
        }
    }
    if (node->left) {
        current = node->name;
        left = node->left->name;
        if (current == u && left == v)
            return true;
        else if (current == v && left == u)
            return true;

        // recursion
        if (checkadjacent(node->left,v)) {
            return true;
        }
    }

    return false;
}

另请注意:

  • 我没有改变 Node 的定义。
  • 除了 string 之外,您的代码只是 C 代码。在 C++ 中,您可以为二叉树创建一个更具可读性的类。
  • 上面代码的任何部分都没有链表(您发布的代码中也没有)。节点具有左子节点和右子节点的事实并没有使它成为一个链表(特别是它不是一个列表,因为它不是一维的)。
  • 同样,我没有测试了这段代码;你可以自己做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。