当前位置: 首页 > 知识库问答 >
问题:

测试二叉树的成员

徐卓
2023-03-14

我目前正在尝试遍历二叉树以检查某些值是否在其中。for 循环正在测试 1 到 50 之间的所有值,并将为每个匹配的值返回 true。

这是当前的树:

              8
            /    \
           4      38
          / \    /  \
         3  7   31  39
        /      / \   \
       1     16  33  45

IntegerData test(0);
for (int i = 0; i < 50; i++) {
  test.value = i;
  if (bt->member(&test)) {
   cout << "member true for " << i << endl;
  }
}

现在我必须实现成员函数,我有正确的想法下来,但它在检查根后停止,根 -

bool BinaryTreeNode::member(Data * data) {
BinaryTreeNode *newNode = new BinaryTreeNode(data);
   if (data->compareTo(this->nodeData) == 0) {
       return true;
   }
   else if (data->compareTo(this->left->nodeData) == 0) {
       return true;
       newNode->member(data);
   }
   else if (data->compareTo(this->right->nodeData) == 0) {
       return true;
       newNode->member(data);
   }
   return false;
}

前面所述的for循环打印输出

member true for 8
member true for 4
member true for 38

但仅此而已。

有人会通过伪代码或脚本提供一些方向吗?你不必给我代码,因为我想自己弄清楚。谢谢。

共有2个答案

令狐经武
2023-03-14

这是一个不可靠的树遍历算法的实现。但是,如果您想保留现有内容,请考虑将return语句的位置与其下面的语句进行交换。

然而,这就是我如何重构你的代码

bool member(BinaryTreeNode *node, Data *data) {
   // Create wrapper for data
   BinaryTreeNode *newNode = new BinaryTreeNode(data);

   if (data->compareTo(node->nodeData) == 0) { // Check the current node only!
       return true;
   else  // delegate the rest of the tree to recursion.
       if (member(node->left,  data)) // Check the left
       || (member(this->right, data)) // Check the right
           return true;
       else
         return false;
}

话说回来,你应该测试一下,让我知道它是否有效。我来自Ruby,我已经有一段时间没有用C编程了。

哦,当您想在驱动程序代码中调用它时,请将二叉树的根节点作为第一个节点传递。如果这是一个类或模块函数,请尝试传递 self。我的希望是自我指向节点

顾乐心
2023-03-14

假设这是一个有序的 BST:

bfs(root) {
    if (root is null) 
        return false // if we get to leaves without finding the target, it's not there
    if (root is target value)
        return true // if we found it, then YAY
    if (root is less than target value)
        return bfs(right child) // if target > root, target must lie in right subtree
    return bfs(left child) // otherwise target < root, check left subtree

如果你检查子节点,你会检查其中的一些两次(一次是子节点,一次是根节点)。这也使得代码更加复杂,这可能是导致你的逻辑错误的原因。

编辑:刚刚找到了算法的解释。

编辑:我还想强调你犯的一个小错误,我已经看到很多人这样做 - 调用一个返回某些东西但不对返回值做任何事情的函数

我说的台词是新节点-

 类似资料:
  • 我需要一些关于递归函数使用的家庭作业问题的帮助。 我们希望通过嵌套元组表示二叉树,其中每个叶子都有一个字符串作为标签。我们要求叶子用不同的非空字符串标记,并且所有非叶节点都只有两个子节点。例如是有效的二叉树。 我要写一个递归函数valid_binary_tree(树),检查,即返回true或False,如果给定的树是一个递归元组,表示如上所述的二叉树。 我把这个问题分成两个功能。一个,检查字符串元

  • 我已经实现了一个二进制搜索树。我在JUNIT测试中的大部分测试都在进行中,包括这两个。我已在EntreIsPerfect()时实现了LeaveSisCorrect,并在AscendingOrderInCrementSheight()中插入了Values。 这两个测试都通过了,但根据他们的描述,我不知道它是否写得正确。 //TODO:请帮助我了解我是否已在InsertValues sinAscend

  • 二叉树 二叉树采用二叉链表存储,要求根据给定的先序遍历序列和中序遍历序列建立二叉树,并输出后序遍历序列、结点总数、叶子数、度为1的结点数、度为2的结点数。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据的第一行输入结点数n(1≤n≤10),第二、三行各输入n个整数,分别表示二叉树的先序遍历序列和中序遍历序列。 输出格式: 对于每组测试,在一行上分别输出该二叉树的后序遍历序列,结点总数,叶子

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 2. 二叉树 2.1. 二叉树的基本概念 链表的每个节点可以有一个后继,而二叉树(Binary Tree)的每个节点可以有两个后继。比如这样定义二叉树的节点: typedef struct node *link; struct node { unsigned char item; link l, r; }; 这样的节点可以组织成下图所示的各种形态。 图 26.9. 二叉树的定义和举例 二叉树可