标签: binary-tree

从BinaryTree中删除BinaryTreeNode

我有一个BinarySearchTree由节点组成的节点,这些节点都是dataType学生的模板类,其中student是一个具有名称和等级的私有变量的类.

目前我可以打印树,在树中查找名称和/或等级,但我在从树中删除节点时遇到问题.

我试图删除所有年级<50(因此失败)的学生.

删除节点后,需要执行以下任一操作:

  1. 左子项为空:用正确的子项替换节点.
  2. 左子项不为空:用左分支中的最高元素替换节点.

我对此的理解是,如果这是树:

      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++ tree binary-tree memory-management

6
推荐指数
1
解决办法
5476
查看次数

为什么C中的很多二叉树数据结构没有父节点指针?

我是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容量的限制,我想我们可以放弃没有父节点的解决方案,不是吗?

也许不是相关的

就像链表双向链表,我们应该使用双链表来实现StackQueue

c algorithm binary-tree

6
推荐指数
2
解决办法
4287
查看次数

仅给出一次遍历时,查找二叉树的其他两个遍历

我知道你可以在给出它的顺序和前序遍历作为字符串时重建二叉树,但是只有在给定顺序遍历时才能找到后序和/或preoder遍历吗?

c++ binary-tree inorder postorder preorder

6
推荐指数
1
解决办法
581
查看次数

为什么我不能在C++中的三元条件语句中使用"break"语句?

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让编译器接受它.

有人可以解释它是如何解释单线及其对象的原因吗?

c++ binary-tree ternary-operator data-structures

6
推荐指数
2
解决办法
4974
查看次数

O(n)时间非递归过程遍历二叉树

我正在读一本名为" 算法简介 "的书.我想很多人都知道.我刚刚碰到一个看似相当困难的问题:

编写一个O(n)-time非递归过程,给定一个n节点二叉树,打印出每个节点的密钥.在树本身之外使用不超过恒定的额外空间,并且在过程中不要修改树,即使是暂时的.

我看到还有另外一个问题:如何在没有额外内存的情况下在O(n)时间遍历二叉树,但主要区别在于我无法修改树.我正在考虑使用一些访问过的标志,但我还没有提出正确的解决方案.这可能是我看不到的明显的东西.你会如何设计一个解决这个问题的算法?即使是对答案的一些指示也会受到赞赏.

algorithm binary-tree

5
推荐指数
1
解决办法
3860
查看次数

在 O(1) 中确定基于数组的二叉树中的最低子节点(具有最大索引的后代)?

一些二叉树结构(例如堆)可以通过设置从左到右、从上到下的索引来使用数组来实现

           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(???)

arrays algorithm math binary-tree data-structures

5
推荐指数
1
解决办法
465
查看次数

画一棵二叉树

我正在寻找一个js库,它允许用户绘制二叉树:添加/删除叶子,添加/删除父节点等。

我发现了很多库,但其中大多数仅用于数据可视化(例如:d3),而不是从浏览器中绘制。

这真的存在吗?

谢谢!

javascript binary-tree data-structures

5
推荐指数
1
解决办法
1万
查看次数

什么是有根的树?

树起根来是什么意思?我读了这里的定义,但即使我们指定一个节点作为根,为什么树只采用下面的形状?我的意思是我可以画一棵有 4 个顶点的有根树,而不是下面的 4 个形状吗?正确的?

在此输入图像描述

tree binary-tree data-structures

5
推荐指数
1
解决办法
8249
查看次数

如何从逻辑应用 HTTP 响应将多行插入到 Azure 表存储中?

我有一个逻辑应用程序,它可以 ping API 并获取一组对象作为响应。简单的问题,但遗憾的是不容易找到答案:如何在 Azure 表存储中进行多次插入,即为从 HTTP 响应返回的每个数组项插入一行?

我应该以某种方式使用“For Each”吗?在此输入图像描述

或者我应该解析 JSON,然后执行 For Each 操作?

python binary-tree

5
推荐指数
0
解决办法
318
查看次数

JavaScript 从数组构建不完整二叉树

这似乎是一个重复的问题,但我无法在 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)

javascript binary-tree

5
推荐指数
1
解决办法
1069
查看次数