binary-tree 相关问题

一种树数据结构,其中每个节点最多有两个子节点。

从数学表达式中删除多余的括号

我想编写一个程序,接受后缀表达式并将其转换为中缀表达式,并且应从中缀表达式中删除所有多余的括号。 我已经写了p...

回答 1 投票 0

二叉树最大路径和:逻辑错误

我正在尝试解决寻找二叉树最大路径和的问题。我将发布问题陈述。 编写一个函数,接受二叉树并返回其最大路径和。路径是一个集合...

回答 1 投票 0

何时在递归中使用辅助方法

我不确定何时使用辅助方法来解决二叉树中的递归问题,何时不使用辅助方法。例如,在二叉树的最低公共祖先中,代码可以在没有 h 的情况下完成...

回答 1 投票 0

二叉树分段故障(核心转储)

结构树{ 字符串[30]; int hmanyt; 结构树*左; 结构树*右; }; typedef 结构树 * drzewo; void printftree(drzewo* korzen) { if((*korzen)->左!= NU...

回答 1 投票 0

关于二叉树属性的一些困惑关于外部节点数 = 内部节点数 + 1

每个人都会同意,如下所示,这是一棵有效的二叉树。 *(右) \ \ * (C) 上面标记为 R 的二叉树节点是根节点,标记为 C 的节点是子节点。 这不是F...

回答 1 投票 0

中序遍历的排序序列是否意味着二叉树是 BST?

二叉搜索树 (BST) 的中序遍历会产生排序序列。我想知道,如果我们对二叉树进行中序遍历并获得排序序列,这是否意味着......

回答 1 投票 0

分割二叉树代码在某些情况下不起作用

我正在尝试解决Python中分割二叉树的问题。我将发布问题陈述。 编写一个函数,接受至少一个节点的二叉树,并检查该二叉树是否......

回答 1 投票 0

最大堆中的第 k 个最大元素可能位于哪些级别?

考虑一个包含 n 个元素的最大堆。我有兴趣确定堆中第 k 个最大元素可能所在的级别,其中 2 <= k <= floor(n/2). It's assumed t...

回答 1 投票 0

二叉树插入元素 - 仅适用于插入根,不适用于任何其他节点

我正在学习算法。我了解如何实现二叉树,但我的插入代码不起作用:当我从一个空树开始并调用 insert 向树中插入一些值时,它......

回答 1 投票 0

二叉树插入元素 [Java] - 算法问题

我正在学习算法,但不知何故陷入困境。我了解如何实现二叉树,但我的代码(Java 中)不起作用。 你能解释一下为什么吗? 谢谢你! 公共类树{ 私人课程...

回答 1 投票 0

如何求一棵有n个节点的AVL树的最大高度?

我的练习考试中有一个问题如下: 给定一个有 23 个节点的二叉搜索树,如果它也具有 AVL 属性,那么该二叉搜索树的最大高度是多少...

回答 1 投票 0

从文件创建二叉树,无需递归C++

首先,我想道歉,因为我不知道如何恰当地表达标题。这是我遇到的问题。 我在从文件创建树时遇到问题。 该文件看起来

回答 1 投票 0

Common Lisp 中二叉搜索树实现中的类型错误

我目前正在 Common Lisp 中实现二叉搜索树,并且遇到了类型错误。当我尝试在树中查找最小或最大键时,会出现错误。这是

回答 1 投票 0

二叉树预序遍历

我有一个二叉树的数据类型和一个计算其前序遍历的函数: 数据 BT a = 空 |叉a (BT a) (BT a) 推导(显示) 树预序 :: BT a -> [a] 树预购 Em...

回答 1 投票 0

这个迭代中序遍历算法是众所周知的吗?

我担心莫里斯遍历算法中的方法,并提出了在节点中使用父指针的更简单的解决方案。 限制如下: 时间复杂度:O(n) 空间

回答 1 投票 0

迭代有序二叉树

我有以下用于创建二叉树的类: 二叉树类: def __init__(自身): self._root = 无 self._left = 无 self._right = 无 默认根...

回答 1 投票 0

使用二叉搜索树的 C 语言简单数据库

我的任务是用 C 语言编写一个简单的数据库。该程序将接收标准输入中的指令并打印它们的结果。说明的格式如下: : 我的任务是用 C 语言编写一个简单的数据库。该程序将接收标准输入中的指令并打印其结果。说明的格式如下:<operation>: <year> <month> <day> <name>。有 3 个操作:“S”(搜索)、“F”(查找)和“D”(删除)。存储指令会将条目存储在数据库中,如果条目已在数据库中,则打印“已存储”或“已存储”。如果该条目在数据库中,查找指令将打印“找到”,否则将打印“未找到”。删除指令将从数据库中删除该条目,如果找到该条目,则打印“已删除”,否则将打印“未找到”。 由于时间限制,我不能简单地使用链表作为我的解决方案。首先,我尝试使用哈希映射(pastebin 链接)。我尝试使用二叉搜索树,但对条目进行哈希处理(pastebin链接)。这些尝试都没有成功(他们通过了简单的测试,但在大型测试中失败了)。最后我只是尝试了“最简单”的方法 - 存储整个条目的二叉树。这次尝试也通过了简单的测试,但在大型测试中失败了......现在我完全陷入困境。这是我当前的代码: #ifdef __STDC_LIB_EXT1__ #define __STDC_WANT_LIB_EXT1__ 1 #define scanf scanf_s // Bit hacky ngl. #endif #include <stddef.h> // NULL #include <stdio.h> // scanf()/scanf_s(), puts() #include <stdlib.h> // malloc(), free() #include <string.h> // strcmp() typedef struct { unsigned short year; unsigned char month, day; char *name; } User; typedef struct BinaryTreeNode { struct BinaryTreeNode *left, *right; User user; } BinaryTree; static inline BinaryTree *BinaryTree_alloc(User user) { BinaryTree *tree = (BinaryTree *) malloc(sizeof(BinaryTree)); tree->left = NULL; tree->right = NULL; tree->user = user; return tree; } static inline void BinaryTree_dealloc(BinaryTree *tree) { if (tree) { BinaryTree_dealloc(tree->left); BinaryTree_dealloc(tree->right); free(tree); } } int BinaryTree_compare(BinaryTree *tree, User user) { if (tree->user.year > user.year) return 1; else if (tree->user.year < user.year) return -1; else if (tree->user.month > user.month) return 1; else if (tree->user.month < user.month) return -1; else if (tree->user.day > user.day) return 1; else if (tree->user.day < user.day) return -1; else return strcmp(tree->user.name, user.name); } BinaryTree *BinaryTree_store(BinaryTree *tree, User user) { if (tree) { switch (BinaryTree_compare(tree, user)) { case 1: tree->left = BinaryTree_store(tree->left, user); break; case -1: tree->right = BinaryTree_store(tree->right, user); break; default: puts("Already stored"); } return tree; } puts("Stored"); return BinaryTree_alloc(user); } BinaryTree *BinaryTree_find(BinaryTree *tree, User user) { if (tree) switch (BinaryTree_compare(tree, user)) { case 1: return BinaryTree_find(tree->left, user); case -1: return BinaryTree_find(tree->right, user); default: puts("Found"); } else puts("Not found"); return tree; } static inline User BinaryTree_find_min_user(BinaryTree *tree) { while (tree->left) tree = tree->left; return tree->user; } BinaryTree *BinaryTree_delete(BinaryTree *tree, User user) { if (tree) switch (BinaryTree_compare(tree, user)) { case 1: tree->left = BinaryTree_delete(tree->left, user); break; case -1: tree->right = BinaryTree_delete(tree->right, user); break; default: if (!tree->left && !tree->right) { free(tree->user.name); free(tree); tree = NULL; puts("Deleted"); } else if (!tree->left || !tree->right) { BinaryTree *root = tree; if (!tree->left) tree = tree->left; if (!tree->right) tree = tree->right; free(root->user.name); free(root); puts("Deleted"); } else { User min_user = BinaryTree_find_min_user(tree->right); tree->user = min_user; tree->right = BinaryTree_delete(tree->right, min_user); } } else puts("Not found"); return tree; } int main() { char operation; User user; BinaryTree *tree = BinaryTree_alloc((User) { 0, 0, 0, NULL }); while (5 == scanf(" %c : %hu %hhu %hhu %m[^\n]", &operation, &user.year, &user.month, &user.day, &user.name)) { switch (operation) { case 'S': BinaryTree_store (tree, user); break; case 'F': BinaryTree_find (tree, user); break; case 'D': BinaryTree_delete(tree, user); break; } } BinaryTree_dealloc(tree); } 有人请帮助我:3 我不确定问题是什么,但您提到“大型”测试失败,因此在递归函数上从传递 User 切换到 User * 将使用更少的堆栈空间。 (不固定)C 不保证尾部调用优化,因此您应该更喜欢迭代而不是递归算法,后者本质上具有未绑定的堆栈大小要求。 如果您先处理特殊情况,那么通常很长的正常情况的缩进就会较少。这也是您通常期望的递归函数(首先是基本情况)。 BinaryTree_compare() 很奇怪,因为您正在比较两个用户,因此将其更改为 User_compare() 并传入两个 User *。调用者假定函数返回 -1、0 或 1,但 strcmp() 的情况并非如此,因此请确保现在确实如此。在通话中,我还切换了参数,因为对我来说,-1 表示树的 left 侧和 +1 右侧更有意义。 (未修复)考虑重构 BinaryTree_find() 和/或 BinaryTree_store() 以消除非常相似的代码。 main() 分配一个空节点,但我认为仅仅盯着 NULL 更有意义。 我删除了inline,因为编译器可能比你更了解它是否使用它。我可能会删除 BinaryTree_find_min_user() 并只在 BinaryTree_delete() 中添加那句台词。 #ifdef __STDC_LIB_EXT1__ #define __STDC_WANT_LIB_EXT1__ 1 #define scanf scanf_s // Bit hacky ngl. #endif #include <stddef.h> // NULL #include <stdio.h> // scanf()/scanf_s(), puts() #include <stdlib.h> // malloc(), free() #include <string.h> // strcmp() typedef struct { unsigned short year; unsigned char month, day; char *name; } User; typedef struct BinaryTreeNode { struct BinaryTreeNode *left, *right; User user; } BinaryTree; static BinaryTree *BinaryTree_alloc(const User *user) { BinaryTree *tree = malloc(sizeof *tree); tree->left = NULL; tree->right = NULL; tree->user = *user; return tree; } static void BinaryTree_dealloc(BinaryTree *tree) { if (!tree) return; BinaryTree_dealloc(tree->left); BinaryTree_dealloc(tree->right); free(tree); } int User_compare(const User *a, const User *b) { if (a->year > b->year) return 1; else if (a->year < b->year) return -1; else if (a->month > b->month) return 1; else if (a->month < b->month) return -1; else if (a->day > b->day) return 1; else if (a->day < b->day) return -1; int rv = strcmp(a->name, b->name); return rv < 0 ? -1 : rv > 0 ? 1 : 0; } BinaryTree *BinaryTree_store(BinaryTree *tree, const User *user) { if (!tree) { puts("Stored"); return BinaryTree_alloc(user); } switch (User_compare(user, &tree->user)) { case -1: tree->left = BinaryTree_store(tree->left, user); break; case 1: tree->right = BinaryTree_store(tree->right, user); break; default: puts("Already stored"); } return tree; } BinaryTree *BinaryTree_find(BinaryTree *tree, const User *user) { if (!tree) { puts("Not found"); return NULL; } switch (User_compare(user, &tree->user)) { case -1: return BinaryTree_find(tree->left, user); case 1: return BinaryTree_find(tree->right, user); default: puts("Found"); } return tree; } static User *BinaryTree_find_min_user(BinaryTree *tree) { for (; tree->left; tree = tree->left); return &tree->user; } BinaryTree *BinaryTree_delete(BinaryTree *tree, User *user) { if (!tree) { puts("Not found"); return tree; } switch (User_compare(user, &tree->user)) { case -1: tree->right = BinaryTree_delete(tree->right, user); break; case 1: tree->left = BinaryTree_delete(tree->left, user); break; default: if (!tree->left && !tree->right) { free(tree->user.name); free(tree); tree = NULL; puts("Deleted"); } else if (!tree->left || !tree->right) { BinaryTree *root = tree; if (!tree->left) tree = tree->left; if (!tree->right) tree = tree->right; free(root->user.name); free(root); puts("Deleted"); } else { User *min_user = BinaryTree_find_min_user(tree->right); tree->user = *min_user; tree->right = BinaryTree_delete(tree->right, min_user); } } return tree; } int main() { char operation; User *user = &(User) {0}; BinaryTree *tree = NULL; while (5 == scanf(" %c : %hu %hhu %hhu %m[^\n]", &operation, &user->year, &user->month, &user->day, &user->name)) { switch (operation) { case 'S': tree = BinaryTree_store (tree, user); break; case 'F': BinaryTree_find (tree, user); break; case 'D': BinaryTree_delete(tree, user); break; } } BinaryTree_dealloc(tree); } 和示例运行: $ cat input.txt S : 2023 11 28 m S : 2023 11 28 m S : 2023 11 28 a S : 2023 11 28 z F : 2023 11 28 m D : 2023 11 28 m F : 2023 11 28 m $ ./a.out < input.txt Stored Already stored Stored Stored Found Deleted Not found

回答 1 投票 0

二叉树删除实现

我正在尝试在 Dart 中实现一个简单的二叉树。我的插入和搜索似乎工作得很好,但我的删除/删除却不行。 无效删除(int targetData){ 二叉搜索树节点?目标=查找(

回答 1 投票 0

了解 C 语言中二叉树实现的功能

我在使用删除函数从二叉树中删除节点时遇到问题。这是我的第一个树程序,我发现书籍和互联网页面的删除功能非常令人困惑。我写了

回答 1 投票 0

如何正确遍历一棵树?

以下代码在树中插入一些节点,并显示同一 B 树的中序和先序遍历。中序遍历似乎是正确的,因为节点是按 asc 排列的...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.