请你好 - 这是我的第一个问题.= P
基本上作为夏季项目,我一直在浏览维基百科页面上的数据结构列表并尝试实现它们.我上学期参加了C++课程并发现它非常有趣,作为我实施二项式堆的最终项目 - 这也非常有趣.也许我很讨厌,但我喜欢数据结构.
无论如何,足够的背景故事.项目进展顺利,我从二叉树开始.为了更进一步,我需要创建迭代器来遍历树.我已经决定为每个遍历方法(常规迭代器和常量迭代器)创建两种类型的迭代器,我只是不知道如何做到这一点.我听说过从stl的迭代器继承,甚至使用boosts iterator_facade(这似乎是个不错的选择)
我还没有尝试编写迭代器代码,因为我不知道从哪里开始,但我确实在github上有我当前的代码.你可以在这里查看.
如果你反对github,我会粘贴相关的类定义.这些功能的实现实际上没有任何帮助,但如果您出于某种原因需要它们,请告诉我.此外,节点类具有用于迭代目的的父指针.
#ifndef __TREES_HXX
#define __TREES_HXX
#include <cstdlib> // For NULL
#include <algorithm> // for std::max
// Node class definition. These nodes are to be used for any
// tree where the structure is
// node
// /\
// left right
// /\ /\
//
// etc., basically two children.
template <typename T>
class Node
{
public:
T data_;
Node<T>* left_;
Node<T>* right_;
Node<T>* parent_; // Needed …Run Code Online (Sandbox Code Playgroud) 假设我有一个二叉搜索树,它最初满足所有的红黑条件,并且在某些集合S中包含每个整数s的一个节点.接下来,我想要一个新节点; 说一个(不在S中).
重新平衡后,这个添加的结果是独一无二的吗?
换句话说:插入节点后是否只有一种方法可以重新平衡红黑树?
我相信它们并不是独一无二的,尽管我没有提供任何证据(而且信心不足).我只是想知道一个比我更有知识的人是否会如此善良以至于能够启发我?
我正在使用PHP(CodeIgniter)和MySQL为网站实现MLM树.我需要在数据库中实现二叉树实现.以下事项应予以考虑:
对于每个节点,左子树中子项/节点数的最小值和右子树中子项/节点的数量称为一对.对于每对,一个节点获得1个点 - 应该存储在数据库中(节点代表用户)
当创建新节点(无论在哪里)时,许多节点的对可能会递增.因此,无论何时创建节点,都应更新每个节点的点(在适用时加1)
另一个约束是每天任何节点不能超过100个点.
我还需要构建(在网页中显示)树.只显示4-5个级别.
数据库可能有100000个节点
我发现主要有4个模型用于实现MySQL,PHP中的hieararchical数据
所以我想找到一个解决方案,它将减少插入开销并成功更新所有适用节点的点数.
我已经尝试了邻接List解决方案.
node ( id, parentid, leftChildId,rightChildId,leftCount,rightCount )
userStat(id,sdate,pairs,mlmIncome)
Run Code Online (Sandbox Code Playgroud)
每次插入一个节点时,我向上移动并继续递增子计数.如果新对生成,那么我也增加它并增加点...我正在使用存储过程执行这些操作.
我在嵌套集上选择此解决方案的原因是:对于插入的每个节点,要为嵌套集更新的节点数总是大于邻接列表.
虽然构建树的速度不仅仅是插入.嵌套集更好地构建树.
我在正确的方向吗?请帮忙 !
Thnx提前!
作为Java赋值的一部分,我必须使用输入算术表达式并将其存储在二叉树中.
除了我在表达式的字符串中读取的部分并将其存储在二叉树中之外,我已完成了赋值所需的所有操作.
我创建了一个名为BinaryTree的类.它唯一的领域是一个名为root的treenode.这个treenode被定义为BinaryTree中的内部类.它有3个字段,一个通用数据字段,以及两个类型为BinaryTree的子节点(左和右).
我很难在一个表达式中定义一个读取算法
(5*(2 + 3)^ 3)/ 2
并将其存储在这样的树中
/
^ 2
* 3
5 +
2 3
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助算法吗?
我正在阅读的一本书声称,检查二叉树是否是二叉树B的子树的一种方法A是构建两个树的inorder和preorder字符串(表示每棵树的顺序和前序遍历的字符串),并检查是否inorder_B是的子inorder_A 和 preorder_B是的子串preorder_A.请注意,它声称,你必须检查串匹配两者中序和序字符串.
是不是真的有必要检查一个串匹配两者中序和序字符串?检查两者都不够吗?有人可以提供一个证明我错的例子(即证明书中的权利要求)吗?我无法想出一个例子,其中两棵树是不相等的,但预订或顺序字符串匹配.
我试图理解删除二叉搜索树的递归方法是如何工作的.我在许多地方遇到的代码如下所示:
void destroy_tree(struct node *leaf)
{
if( leaf != 0 )
{
destroy_tree(leaf->left);
destroy_tree(leaf->right);
free( leaf );
}
}
Run Code Online (Sandbox Code Playgroud)
我无法理解a)如果例程中没有返回,它是如何工作的?b)当free()被调用时?我想想,例如,这样一棵树:
10
/ \
6 14
/ \ / \
5 8 11 18
Run Code Online (Sandbox Code Playgroud)
所以我的理解是我遍历10-> 6-> 5,然后我调用destroy_tree(5->左).因此,leaf if if为NULL,并且if-dependent不执行,因此5不被删除.我在哪里弄错了这个推理?如何在这里进行卷绕和退绕?任何帮助都很感激:-)
正如在几个SO问题中所解释的那样,并且在mathworld中更抽象地解释,加泰罗尼亚数字的序列恰好对应于可以为任何给定数量的运算符生成的括号分组的数量.但我还没有找到生成所有这些分组的算法.
该二进制包围算法对应于Tamari Lattice,并且可以以多种不同方式描述.该算法最明显的实际用途是通过围绕二元运算符和它们运算的数字的每个可能的包围来生成所有可能的表达式.这可以用于穷举测试二叉树上的各种类型的操作.
网络搜索确实揭示了C#中的一个实现,但我认为我需要一段时间来理解,因为我不知道C#语法.
那么,什么python代码生成围绕运算符的所有可能的括号分组(因此可以与实际表达式一起使用以生成所有可能性)?对于2,3和4,输出如下所示:
AllBinaryTrees(2)
AllBinaryTrees(3)
AllBinaryTrees(4)
更好的是代码可以执行以下操作:
AllBinaryTrees( "2 + 3/4")
输出:
所以,过去一个月我一直在学习C#,而目前我正在与Binary Trees进行斗争.
我的问题是,如何将我的树调用到控制台窗口?我试过Console.WriteLine(tree.Data);但这似乎写54到我的控制台窗口.
如果你需要检查一下,这是我的代码:
主文件
static void Main(string[] args)
{
//Creating the Nodes for the Tree
Node<int> tree = new Node<int>('6');
tree.Left = new Node<int>('2');
tree.Right = new Node<int>('5');
Console.WriteLine("Binary Tree Display");
Console.WriteLine(tree.Data);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
节点类
class Node<T> where T : IComparable
{
private T data;
public Node<T> Left, Right;
public Node(T item)
{
data = item;
Left = null;
Right = null;
}
public T Data
{
set { data = value; }
get { return data; …Run Code Online (Sandbox Code Playgroud) 我试图在C#中实现二叉树,而不是二进制搜索树.我实现了下面的代码,它工作正常,但不是我想要的.基本上我正在尝试实现一个完整的二叉树,但是使用我的下面的代码,我得到一个不平衡的二叉树.
Input : 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
Desired Output :
10
/ \
20 30
/ \ / \
40 50 60 70
/ \ /
80 90 100
Current Output :
10
/ \
20 30
/ \
40 50
/ \
60 70
/ \
80 90
/
100
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
class Node
{
public int data;
public Node left;
public Node right;
public Node()
{
data = 0;
left = null;
right …Run Code Online (Sandbox Code Playgroud) 所以我知道遍历顺序的递归的空间复杂度是O(h)而不是O(n),因为h =树高度,n =树中节点的数量.
这是为什么?让我们说这是遍历的代码:
public void inorderPrint (TreeNode root) {
if (root == null) {
return;
}
inorderPrint(root.left);
System.out.println(root.data);
inorderPrint(root.right);
}
Run Code Online (Sandbox Code Playgroud)
我们将n个内存地址推送到调用堆栈,因此,空间复杂度应为O(n).
我错过了什么?