【问题标题】:Check if 2 nodes are adjacent in binary tree using linkedlish C++使用linkedlish C++检查二叉树中2个节点是否相邻
【发布时间】:2021-08-01 02:26:52
【问题描述】:

抱歉英语不好。 我正在使用 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, u, v)){
            return true;
        }
    }
}

【问题讨论】:

  • 二叉树中的相邻是什么意思?亲子关系?如果是这种情况,只需检查一个是否是另一个的孩子。以及如何只使用一个链表来表示一棵二叉树?

标签: c++ algorithm data-structures boolean binary-search-tree


【解决方案1】:

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

话虽如此,我假设您的代码无法编译。我将您的代码的错误和其他问题以及代码的更正版本放在一起(可能是不全面的)列表。但是,我建议您观看一些有关 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)。 (这是为了风格)
  • 然后您也可以省略第 3 个和第 4 个 if 语句,并将它们的块分别放入第 1 个和第 2 个 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, u, v)) {
            return true;
        }
    }

    return false;
}

另请注意:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多