- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面的代码应该在一系列插入和删除之后输出二叉搜索树的最终高度。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
struct Node{
int data;
struct Node *left;
struct Node *right;
};
struct Node* Insert(int data, struct Node *root){
if(root == NULL){
root = malloc(sizeof(struct Node));
root -> data = data;
root -> left = root -> right = NULL;
}
else{
if(data < root -> data) Insert(data, root -> left);
else if(data > root -> data) Insert(data, root -> left);
}
return root;
}
struct Node* Find(int data, struct Node *root){
if(root == NULL || root -> data == data) return root;
if(data < root -> data) return Find(data, root -> left);
if(data > root -> data) return Find(data, root -> right);
}
int FindMin(struct Node *root){
int min, l_min, r_min;
if(root == NULL) return INT_MIN;
min = root -> data;
l_min = FindMin(root -> left);
r_min = FindMin(root -> right);
if( l_min < min ) min = l_min;
if( r_min < min ) min = r_min;
return min;
}
struct Node* Delete(int data, struct Node *root){
struct Node *temp;
if(data < root -> data) root -> left = Delete(data, root -> left);
else if(data > root -> data) root -> right = Delete(data, root -> right);
else{
if(root -> left != NULL && root -> right != NULL){
root -> data = FindMin(root -> right);
root -> right = Delete(root -> data, root -> right);
}
else{
temp = root;
if(root -> left == NULL) root = root -> right;
if(root -> right == NULL) root = root -> left;
free(temp);
}
}
return root;
}
int Height(struct Node *root){
int l_height, r_height;
if(root == NULL) return 0;
else{
l_height = Height(root -> left);
r_height = Height(root -> right);
if(l_height > r_height) return l_height + 1;
else return r_height + 1;
}
}
int main(){
struct Node *root = NULL, *temp = NULL;
int n, a, b;
scanf("%i",&n);
while(n--){
scanf("%i %i",&a,&b);
if(a == 1){
temp = Find(b,root);
if(temp != NULL) continue;
root = Insert(b,root);
}
else if(a == 2){
temp = Find(b,root);
if(temp == NULL) continue;
root = Delete(b,root);
}
else{
continue;
}
}
printf("Height: %i\n",Height(root));
return 0;
}
第一个输入是数字 n,它是后面的行数。
所有后续行都有整数“a b”。 a == 1表示插入,b == 2表示删除,b为要插入或删除的值。 “查找”功能测试 BST 上是否存在某个值,这样我就不会插入已经存在的内容或尝试删除 BST 上不存在的内容。
因此,例如,这是一个有效的测试用例,它应该返回 5:
10
1 5
1 8
1 3
1 4
1 2
1 1
1 0
1 7
1 9
2 3
但是,我的代码没有这样做,只是为每个可能的测试用例返回“1”。我不知道为什么会这样。有什么想法吗?
解决方案:感谢@coderredoc,现在这里是这段代码的完整功能版本。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
struct Node{
int data;
struct Node *left;
struct Node *right;
};
struct Node* Insert(int data, struct Node *root){
if(root == NULL){
root = malloc(sizeof(struct Node));
root -> data = data;
root -> left = root -> right = NULL;
}
else{
if(data < root -> data) root -> left = Insert(data, root -> left);
else if(data > root -> data) root -> right = Insert(data, root -> right);
}
return root;
}
struct Node* Find(int data, struct Node *root){
if(root == NULL || root -> data == data) return root;
if(data < root -> data) return Find(data, root -> left);
if(data >= root -> data) return Find(data, root -> right);
return NULL;
}
struct Node* FindMin(struct Node *root){
struct Node *temp = root;
while( temp -> left != NULL) temp = temp -> left;
return temp;
}
struct Node* Delete(int data, struct Node *root){
struct Node *temp;
if(root == NULL) return NULL;
if(data < root -> data) root -> left = Delete(data, root -> left);
else if(data > root -> data) root -> right = Delete(data, root -> right);
else{
if(root -> left == NULL){
temp = root -> right;
free(root);
return temp;
}
else if(root -> right == NULL){
temp = root -> left;
free(root);
return temp;
}
else{
temp = FindMin(root -> right);
root -> data = temp -> data;
root -> right = Delete( temp -> data, root -> right);
}
}
return root;
}
int Height(struct Node *root){
int l_height, r_height;
if(root == NULL) return 0;
else{
l_height = Height(root -> left);
r_height = Height(root -> right);
if(l_height > r_height) return l_height + 1;
else return r_height + 1;
}
}
int main(){
struct Node *root = NULL, *temp = NULL;
int n, a, b;
scanf("%i",&n);
while(n--){
scanf("%i %i",&a,&b);
if(a == 1){
temp = Find(b,root);
if(temp != NULL) continue;
root = Insert(b,root);
}
else if(a == 2){
temp = Find(b,root);
if(temp == NULL) continue;
root = Delete(b,root);
}
else{
continue;
}
}
printf("%i\n",Height(root));
return 0;
}
最佳答案
是的,那是因为您从未链接任何添加的节点。
if(data < root -> data) root->left= Insert(data, root -> left);
else if(data >= root -> data) root->right = Insert(data, root -> right);
另请注意,在 Insert()
中的两种情况下,您都使用了 root->left
。应该如上所示。
同样在Find()
函数中
struct Node* Find(int data, struct Node *root){
if(root == NULL || root -> data == data) return root;
if(data < root -> data) return Find(data, root -> left);
if(data >= root -> data) return Find(data, root -> right);
// ^ You need to make it >=
return NULL; //<----Add it
}
您遇到的段错误也是因为错误的删除逻辑。正确的应该是
struct Node* Delete(int data, struct Node *root){
struct Node *temp;
if( root == NULL) return NULL;
if(data < root -> data) root -> left = Delete(data, root -> left);
else if(data > root -> data) root -> right = Delete(data, root -> right);
else{
if (root->left == NULL)
{
struct Node *temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL)
{
struct Node *temp = root->left;
free(root);
return temp;
}
else
{
struct Node *temp = FindMin(root->right);
root->data = temp->data;
root->right = Delete( temp->data, root->right);
}
}
return root;
}
此外,您的 findMin
版本仅返回所有节点值的最小值。但这不是 Delete()
函数所需要的。这就是这个功能的原因。
struct Node*FindMin(struct Node* node)
{
struct Node *current = node;
while (current->left != NULL)
current = current->left;
return current;
}
关于c - 插入和删除后在二叉搜索树中查找高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47571512/
过去两天我遇到了一个奇怪的问题,但我还无法解决它。我正在尝试从 2 个文本文件中获取单词并将这些单词添加到树中。我选择的获取单词的方法引用这里: Splitting a text file into
例如,像这样的树: 5 / \ 3 6 / \ 7 2 print(tree.branchLenSum()) 将是1+1+2+2=6 树类: class BinaryTre
我正在学习 JavaScript。我是文档对象模型 (DOM) 主题的新手。 我对节点在 DOM 树中的布局方式感到困惑? 我使用了这个 HTML 文件。 List Buy groceries
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
var nodeEnter = node.enter().append("g") .attr("class", "node") .attr("transform", function (d) {
我正在使用数据表来表示我的应用程序中的数据。我有一个功能,可以在单击克隆图标时克隆任何行并动态添加它下面的行。 数据表具有搜索功能,可以搜索表中存在的所有行,但是它只考虑初始页面加载时加载到表中的行。
我已经用 Python 编写了一个 Tree 类,但是我在为它创建迭代器时遇到了问题我希望能够做到 phonebook = MyTree() # Build up tree for node in p
我需要为 FreeBSD 检查这个 libunwind 端口, http://people.freebsd.org/~kib/git/libunwind.git/ 我以前和当我尝试使用命令 check
我已经实现了自己的 AVL 树,并将其用作字典。我想知道,计算以某个字符串开头的所有单词的最快方法是什么。 例如: string prefix = "fa"; output: 4 我已经在 O(n)
我目前正在尝试编写一个使用 2-3-4 树的程序,但我遇到了插入函数的问题。这是相关代码.. int main () { tree234 myTree; myTree.insert("
我的同事问了我这个问题,但我无法想出任何最佳解决方案。 给定一棵具有n 个节点、n-1 条边和 q 个查询的无向加权树。 每个查询都有输入 u v k ,输出位于路径 u to v 的奇数且小于 k
如果我有一个 app.html 模板如下: ${message} test 使用 MyComponent.ts : export class MyComponent { my
我继承了一个 git 存储库,其中树中的提交条目为空 sha1,阻止 FishEye 为存储库编制索引。 $ git fsck Checking object directoriies: 100%(2
这是一个例子。我也许可以在点击函数中弄清楚它,但我不确定从点击函数外部从根开始检查所有子项的最佳方法。谢谢 .node circle { fill: #fff; stroke: stee
我正在使用 Python 批量编辑许多当前看起来像这样的 musicXML 文件: ... -5 -9
假设有一个 8 阶 B 树。这意味着它可以有 8 个指针和 7 个元素。假设字母 A 到 G 存储在这棵 B 树中。所以这棵 B 树只是一个包含 7 个元素的节点。 然后你尝试将 J 插入到树中。没有
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试做一个简单的二维“物理”模拟,主要涉及圆形物体的碰撞,为了避免编程我自己的空间索引(四叉树/r-tree/等),我希望使用 Boost 的 R -树。 问题是我在 Boost 文档中找不到任
我正在从 python 字典中读取数据并尝试在下面的树中添加更多书籍元素。下面只是一个示例,我需要复制一个元素及其子元素但替换内容,在这种情况下我需要复制 book 元素但替换标题和作者。
假设我有一个变量,它包含一个 nltk 树类的树。是否有类似 parent() 或返回节点父节点的函数? 最佳答案 您需要一种不同的数据结构:一棵树,其节点包含指向其父节点的指针。 NLTK 现在提供
我是一名优秀的程序员,十分优秀!