我有一个BinarySearchTree由节点组成的节点,这些节点都是dataType学生的模板类,其中student是一个具有名称和等级的私有变量的类.
目前我可以打印树,在树中查找名称和/或等级,但我在从树中删除节点时遇到问题.
我试图删除所有年级<50(因此失败)的学生.
删除节点后,需要执行以下任一操作:
我对此的理解是,如果这是树:
1
/ \
2 3
/ \ /\
4 5 6 7
Run Code Online (Sandbox Code Playgroud)
如果2失败,即等级<50
你最终会得到
1
/ \
4 3
\ / \
5 6 7
Run Code Online (Sandbox Code Playgroud)
4是左分支中的最高元素.
如果这是树:
1
/ \
2 3
\ / \
5 6 7
Run Code Online (Sandbox Code Playgroud)
2失败了
你最终会得到
1
/ \
5 3
/ \
6 7
Run Code Online (Sandbox Code Playgroud)
如果这是树:
1
/ \
2 3
/ \ / \
4 5 6 7
Run Code Online (Sandbox Code Playgroud)
1失败了
你最终会得到
5
/ \
2 3
/ …Run Code Online (Sandbox Code Playgroud) 我是C编程的新手,我正在用C学习C算法.
这是我关于如何定义二叉树node数据结构的问题.
以下是用于定义Node数据结构的2个典型示例代码.
typedef struct binaryTreeNode_{
int key;
void *data;
binaryTreeNode_ *leftNode;
binaryTreeNode_ *rightNode;
} binaryTreeNode;
Run Code Online (Sandbox Code Playgroud)
typedef struct binaryTreeNode_{
int key;
void *data;
binaryTreeNode_ *leftNode;
binaryTreeNode_ *rightNode;
binaryTreeNode_ *parentNode;
} binaryTreeNode;
Run Code Online (Sandbox Code Playgroud)
显然,使用具有父节点指针的节点结构将使更多工作变得更加容易.像遍历节点/树,DFS/BFS与二叉树.所以我的问题是为什么有些解决方案基于没有父节点的结构?.
有历史原因吗?如果仅仅因为RAM/DISK容量的限制,我想我们可以放弃没有父节点的解决方案,不是吗?
就像链表和双向链表,我们应该使用双链表来实现Stack和Queue?
我知道你可以在给出它的顺序和前序遍历作为字符串时重建二叉树,但是只有在给定顺序遍历时才能找到后序和/或preoder遍历吗?
Node是一个非常简单的类,只有一个构造函数和一些变量:一个"名称"(实际上只是一个char)和两个名为"left"和"right"的子节点指针.
我刚刚开始编写一些需要放到最左边节点的代码,当我提出这个问题时我很高兴:
Node *current = this->root;
while (true) (current->left != nullptr) ? current = current->left : break;
Run Code Online (Sandbox Code Playgroud)
看起来很简单:在无限循环中,检查当前是否有一个左子,如果是,将当前设置为该左子,如果没有,则跳出循环.这是一个很酷的小单行,不太难以理解.(我评论了它!)
好吧,我的编译器不喜欢它:
iterator.cpp:20:70: error: expected expression
while (true) (current->left != nullptr) ? current = current->left : break;
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
而且,只是在while循环中抛出一些括号并将三元运算符移动到它自己的行上并没有帮助(不出所料).我不得不把它变成if/else让编译器接受它.
有人可以解释它是如何解释单线及其对象的原因吗?
我正在读一本名为" 算法简介 "的书.我想很多人都知道.我刚刚碰到一个看似相当困难的问题:
编写一个O(n)-time非递归过程,给定一个n节点二叉树,打印出每个节点的密钥.在树本身之外使用不超过恒定的额外空间,并且在过程中不要修改树,即使是暂时的.
我看到还有另外一个问题:如何在没有额外内存的情况下在O(n)时间遍历二叉树,但主要区别在于我无法修改树.我正在考虑使用一些访问过的标志,但我还没有提出正确的解决方案.这可能是我看不到的明显的东西.你会如何设计一个解决这个问题的算法?即使是对答案的一些指示也会受到赞赏.
一些二叉树结构(例如堆)可以通过设置从左到右、从上到下的索引来使用数组来实现
0
/\
1 2
/ \ / \
3 4 5 6
/ \ / \ / \ / \
7 8 9 10 11 12 13 14
... ETC。
x可以在 O(1) 中轻松找到索引处节点的子节点和父节点:
左孩子(x) = 2x+1 儿童权利(x) = 2x+2 父级(x) = (x-1)/2
但是有没有办法在 O(1) 中找到 x 的最低后代 (即具有最高索引的后代)?例如,在上面的树中, 的最低后代x=0将是 14,而 forx=1则是10。请注意,对于x=1,如果树中只有 10 个元素,则它应该返回9。
我可以假设我的数组中的元素永远不会超过 2 32 个,因此可以使用位移位在 O(1) 中实现2 n 。也有可能log_2(???)
我正在寻找一个js库,它允许用户绘制二叉树:添加/删除叶子,添加/删除父节点等。
我发现了很多库,但其中大多数仅用于数据可视化(例如:d3),而不是从浏览器中绘制。
这真的存在吗?
谢谢!
我有一个逻辑应用程序,它可以 ping API 并获取一组对象作为响应。简单的问题,但遗憾的是不容易找到答案:如何在 Azure 表存储中进行多次插入,即为从 HTTP 响应返回的每个数组项插入一行?
或者我应该解析 JSON,然后执行 For Each 操作?
这似乎是一个重复的问题,但我无法在 SOF 或其他地方找到我的问题的答案。
我想从Array和一个非空根节点构建一个不完整的二叉树,在JavaScript中,value 代表子树,而不是 value = 的子树。nullnullnull
预期结果:
TreeNode {
val: 1,
left:
TreeNode {
val: 2,
left: TreeNode { val: 4, left: null, right: null },
right: null },
right:
TreeNode {
val: 3,
left: null,
right: TreeNode { val: 5, left: null, right: null } } }
Run Code Online (Sandbox Code Playgroud)
上面的预期输出可以手动完成,如下所示:
TreeNode {
val: 1,
left:
TreeNode {
val: 2,
left: TreeNode { val: 4, left: null, right: null }, …Run Code Online (Sandbox Code Playgroud)