按顺序遍历任意大的二叉树
我坚持寻找解决方案. C#,.NET 4.0,VS2010 我可以很容易地写一个递归的递归,但不能为我的一生而弄清楚如果树是任意大的东西不会溢出堆栈的东西. 这是一个二进制树问题,我试图写一个 public IEnumerable Values() 方法. 如果您感兴趣的话,这是完整的代码: http://pastebin.com/xr2f3yg /p> 显然,当前中的版本无效.我可能应该提到我是C#的新手,从C ++过渡. 解决方案 这是一种使用显式堆栈的内存遍历的方法.堆栈是在堆上创建的,因此它可能比处理器使用的堆栈大得多. public IEnumerable Values() { Stack stack = new Stack(); Node current = this.root; while(current != null) { while(curr
2 2024-04-26
编程技术问答社区
如何纠正BST C#代码中的隐性转换错误?
我写了此代码 我有这些错误 不能隐式将类型X.Program.TreeNode'转换为'int'//findmin 不能隐式将类型X.Program.TreeNode'转换为'int'//findmax ,我的主要或缺失的是吗? 以及如何计算节点,离开并获得高峰(仅需要提示) class Program { static void Main(string[] args) { BinarySearchTree t = new BinarySearchTree(); t.insert(ref t.root, 10); t.insert(ref t.root, 5); t.insert(ref t.root, 6); t.insert(ref t.root, 17); t.i
0 2024-04-25
编程技术问答社区
彬彬有礼树后序遍历,无递归,无节点标志
还有另一种方法吗?只是花了2个小时来弄清楚它.我有一个解决方案(请参阅下面的Dumppostorder),但是,是否有更好或更有效的方法?感觉可能有.规则是 - 没有递归,节点不能具有访问的标志.即,您只能使用左 +右成员. 我的方法是在此过程中摧毁这棵树.通过将双方的孩子设置为null,您可以将节点标记为一次遍历一次,但是我也可以两次与孩子一起看每个节点:(.有更好的方法吗?但没有必要(即,将投票,但不标记答案). using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BinaryTreeNoRecursion { public class TreeNode { public T Value { get; set; } public TreeNode Left { get;
6 2024-04-25
编程技术问答社区
二进制搜索树的迭代高度
我正在尝试一种迭代方法,以找到二进制搜索树的高度/深度. 基本上,我尝试使用广度第一次搜索来计算深度,通过使用队列存储树节点,并仅使用整数来保持树的当前深度.树上的每个节点都排队,并检查子节点的子节点.如果存在子节点,则深度变量会增加.这是代码: public void calcDepthIterative() { Queue nodeQ = new LinkedList(); TreeNode node = root; int level = 0; boolean flag = false; nodeQ.add(node); while(!nodeQ.isEmpty()) { node = nodeQ.remove(); flag = false; if(node.leftChild != null) { nodeQ.a
8 2024-04-23
编程技术问答社区
修复检查输入二叉树是否有序的函数
我有以下代数数据类型: data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Eq) 另外,我有此代码段: fromJust :: Maybe a -> a fromJust (Just val) = val fromJust Nothing = error "Cannot unpack Nothing." getTreeMinimum :: Ord a => Tree a -> Maybe a getTreeMaximum :: Ord a => Tree a -> Maybe a getTreeMaximum Empty = Nothing getTreeMaximum (Node value l r) = if l == Empty && r == Empty then Just value else if l == Empty && r /= Empty then if val
14 2024-04-23
编程技术问答社区
从表达式树中提取所有可能的路径,并将其评估为 "真"。
这是我以前的问题的后续问题:逻辑表达式解析和评估的更好的类结构 简短简介: 规则为字符串 逻辑与的组合,逻辑 - 或,逻辑 - 结束和 分组 em>标识符(id's) 示例:"{100} AND (({101} OR {102}) OR ({103} AND {104})) AND NOT ({105} OR {106})" 当前,这将被评估为一个节点的二进制树,看起来像这样: 从这里获取的代码:如何解析布尔表达并将其加载到类中? 我的实施(在线编译器): using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; namespace Rextester { public class Program { public s
4 2024-04-21
编程技术问答社区
创建具有独特排列方式的所有二叉树
我有一个相当愚蠢的问题,我发誓不是作业.对于我的一生,我不记得我是否曾经研究过一种算法来做到这一点,而我的思想/创造力使我失败了. 我有一个唯一节点的列表.我需要生成包含这些节点的二进制树的所有独特排列.手性,以防万一你想知道,很重要;二进制在其轴上翻转(左/右)的二进制树不同. 一些背景信息,以防万一您想知道:这是用于进化程序的种子创建算法,因此大量的小种子很好. 编辑:澄清唯一性 Examples: This: 1 / \ 2 3 Is not the same as this: 1 / \ 3 2 Nor is it the same as this: 1 / 3 / 2 Nor this: 1 \ 2 \ 3 解决方案 eric lippert具有相关帖子在这里(实际上是一系列帖子的开始).关键位是此递归linq方法: static IEnumerable
2 2024-04-21
编程技术问答社区
寻找二元搜索树中的最低共同祖先
我有以下代码来查找最低的共同祖先(最低的节点是A和B作为后代): public static Node LCA(Node root, Node a, Node b) { if (root == null) return null; if (root.IData == a.IData || root.IData == b.IData) return root; if (root.RightChild != null && (root.RightChild.IData == a.IData || root.RightChild.IData == b.IData)) return root; if (root.LeftChild != null && (root.LeftChild.IData == a.IData || root.LeftChild.IData == b.IData))
6 2024-04-21
编程技术问答社区
C# 在控制台中显示二进制搜索树
我有简单的二进制搜索树 public class BNode { public int item; public BNode right; public BNode left; public BNode(int item) { this.item = item; } } public class BTree { private BNode _root; private int _count; private IComparer _comparer = Comparer.Default; public BTree() { _root = null; _count = 0; } public bool Add(int Item) { if (_root == null)
4 2024-04-17
编程技术问答社区
在C#中对树进行微观优化迭代
我正在从事大规模数字处理项目.自开始以来,我一直在优化所有内容,因为我知道这将很重要.进行性能分析,我的代码在一个功能中花费了几乎40%的寿命 - 二进制树迭代器. public ScTreeNode GetNodeForState(int rootIndex, float[] inputs) { 0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode; 24.6% while (node.BranchData != null) { 0.2% BranchNodeData b = node.BranchData; 0.5% node = b.Child2; 12.8% if (inputs[b.SplitInputIndex]
4 2024-04-16
编程技术问答社区
优化网格的高密度二进制空间划分
我正在编写一个游戏,其中一个角色可以实时在随机生成的地图上移动(如它所揭示的那样.)这使我引发了一个有趣的数据结构问题.该地图是在视图时生成的,围绕角色(可能是20-60个图块)的圆圈,因此在存在数据的地方,它非常密集,并且全部都在网格中.但是,没有数据的地方,可能会有巨大的未生成空间.角色可能会在一个巨大的圆圈中行走,例如,在广阔的空白空间周围形成一圈瓷砖. 一个简单的矩阵将产生大量不需要的开销,并浪费大量空间.但是,典型的BSP似乎会因为数据的密集,网格般的性质而导致巨大的性能下降. 您建议什么?矩阵 - 四分之一 - 两者的混合物? 解决方案 过去一个月我一直在解决这个问题,并提出了我认为是一个相当不错的解决方案.它不如纯矩阵快,而是具有无限扩展的好处(在int的极限内.) 基本上,这是一个二进制空间分区,它会向上构建(而不是向下,就像Quadtree一样.)如果您写入当前分配的矩阵空间之外的点,它会生成较大的节点并扩展.如果大多数节点的子节点是分配的矩阵
10 2024-04-14
编程技术问答社区
优化网格的高密度二进制空间划分
我正在编写一个游戏,其中一个角色可以实时在随机生成的地图上移动(如它所揭示的那样.)这使我引发了一个有趣的数据结构问题.该地图是在视图时生成的,围绕角色(可能是20-60个图块)的圆圈,因此在存在数据的地方,它非常密集,并且全部都在网格中.但是,没有数据的地方,可能会有巨大的未生成空间.角色可能会在一个巨大的圆圈中行走,例如,在广阔的空白空间周围形成一圈瓷砖. 一个简单的矩阵将产生大量不需要的开销,并浪费大量空间.但是,典型的BSP似乎会因为数据的密集,网格般的性质而导致巨大的性能下降. 您建议什么?矩阵 - 四分之一 - 两者的混合物? 解决方案 过去一个月我一直在解决这个问题,并提出了我认为是一个相当不错的解决方案.它不如纯矩阵快,而是具有无限扩展的好处(在int的极限内.) 基本上,这是一个二进制空间分区,它会向上构建(而不是向下,就像Quadtree一样.)如果您写入当前分配的矩阵空间之外的点,它会生成较大的节点并扩展.如果大多数节点的子节点是分配的矩阵
6 2024-04-13
编程技术问答社区
如何创建一个二叉树
我不是说二进制搜索树. 例如, 如果我将值1,2,3,4,5插入二进制搜索树,则遍布遍历将提供 1,2,3,4,5作为输出. 但是,如果我将相同的值插入二进制树中,则遍布遍历应给予 4,2,5,1,3作为输出. 可以使用动态阵列创建二进制树,其中index n中的每个元素, 2n+1和2n+2分别代表其左右孩子. 因此,表示和级别顺序在这里非常容易. ,但我认为,订购后订单,预订很困难. 我的问题是如何像二进制搜索树一样创建二进制树. IE. 有一个包含数据的树类,左右指针而不是数组. 这样我们就可以递归进行遍历. 解决方案 如果我正确理解您,您想从数组中创建二进制树 int[] values = new int[] {1, 2, 3, 4, 5}; BinaryTree tree = new BinaryTree(values); 这应该在以下值1-5的情况下预填充二进制树: 1 / \ 2 3 / \
2 2024-04-13
编程技术问答社区
构建一个平衡的二进制搜索树
是否有一种构建平衡二进制搜索树的方法? 示例: 1 2 3 4 5 6 7 8 9 5 / \ 3 etc / \ 2 4 / 1 我认为有一种方法可以这样做,而无需使用更复杂的自平衡树.否则我可以自己做,但是有人可能已经这样做了:) 感谢您的答案!这是最终的Python代码: def _buildTree(self, keys): if not keys: return None middle = len(keys) // 2 return Node( key=keys[middle], left=self._buildTree(keys[:middle]), right=self._buildTree(keys[middle + 1:]) ) 解决方案 对于每个子树: 找到
6 2024-04-13
编程技术问答社区
SortedDictionary是一棵红黑树吗?
我在互联网上看到了有关此的几个引号,但没有官方文件?谁能告诉我从哪里获得有关此信息的信息? 解决方案 这不应该记录在实施细节. 例如,SortedDictionary有多个实现:有微软的实现. 实际上,单声道实现确实使用了当前版本中的红黑树(2.10.9).当前的.NET版本也是如此(例如,您可以通过使用 Reflector ,ildasm.exe或 monodevelops中的内置IL查看器来找到该代码, ). 但是,这是可能的将来会发生变化,因为实际上有更有效的实现(如 b trees ). so,再次:此信息无用,它是实现细节,并且它 IS 将以高概率进行更改. 其他解决方案 这是 sortedDictionary Generic类是一个二进制搜索树(log) n)检索,其中n是字典中的元素 中的元素数量 排序是红黑树吗? 好,我与 red-black tree 但是我只是用 SortedDictionary始终保持其键.它使您可
2 2024-04-13
编程技术问答社区
在.NET 4.0中是否有一个内置的二进制搜索树?
.NET 4.0中是否有内置的二进制搜索树,还是我需要从头开始构建此抽象数据类型? 编辑 这是针对二进制搜索树的,而不是抽象的数据类型"树". 解决方案 我认为 SortedSet System.Collections.Generic的类是您要寻找的. 来自 它是使用 自平衡红黑树 给出的性能复杂性 o(log n)用于插入,删除和 抬头.它用于保持 按顺序排序的元素,以获取 特定元素的子集 范围,或获得 min 或 max 集合的元素. 源代码 https://github.com/dotnet/corefx/blob/master/src/system.collections/src/src/system/collections/generic/generic/sortedset.cs 其他解决方案 我问一个问题,我意识到,我确实有一个内置的内置二进制搜索树..NET4.0.它可能以后添加,并按预期工作.每次插入后,IT平衡(遍历),这会降
4 2024-04-13
编程技术问答社区
代表树的对象
c#(或.net)中是否有任何代表二进制树(或出于好奇心)和n-ary树的对象? 我不是在谈论演示树控件,而是作为模型对象. 如果没有,是否有好的外部实现? 解决方案 public class BinaryTree : IVisitableCollection, ITree { // Methods public void Add(BinaryTree subtree); public virtual void breadthFirstTraversal(IVisitor visitor); public virtual void DepthFirstTraversal(OrderedVisitor orderedVisitor); public BinaryTree GetChild(int index); public bool Remove(BinaryTree child); public virtual voi
6 2024-04-12
编程技术问答社区
按c的顺序递归地打印二叉树
我一直在研究一个基本上应该打印我在程序中拥有的二进制树的功能,而且我有问题.树是动态的,值是数字,将在右侧添加更大的新数字,左侧较小. 基本上应该打印树的方式是: 假设只有具有值3的根,然后输出将是: (3) 添加带有值2的节点后: ((2)(8)) 我要获得的输出: (((2))((8)))) 添加7: ((2)((7)(((7))
12 2024-04-10
编程技术问答社区
在C语言的二进制搜索树中的词频?
我必须计算二进制树中每个单词存在多少次,而我做不到,我该怎么做?这是我的代码; #include "stdio.h" #include "stdlib.h" #include "string.h" struct treeNode { char data[20]; int count; struct treeNode *leftPtr, *rightPtr; }; int number = 1; typedef struct treeNode TreeNode; typedef TreeNode *TreeNodePtr; void insertNode(TreeNodePtr *treePtr, char word[]); void alphabetic(TreeNodePtr treePtr); int main() { /*reading strings from the file and add them to the tree*/ char
4 2024-04-10
编程技术问答社区