我目前正在尝试遍历二叉树以检查某些值是否在其中。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
但仅此而已。
有人会通过伪代码或脚本提供一些方向吗?你不必给我代码,因为我想自己弄清楚。谢谢。
这是一个不可靠的树遍历算法的实现。但是,如果您想保留现有内容,请考虑将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
。我的希望是自我
指向根
节点
假设这是一个有序的 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. 二叉树的定义和举例 二叉树可