这是节点定义:
struct node{
int data;
stuct node * left;
struct node * right;
};
Run Code Online (Sandbox Code Playgroud)
我要做的是列出指向祖先节点的所有节点.在发布错误的解决方案并从答案中获取建议后,我的新解决方案是:
递归遍历二叉树.将当前节点添加到节点数组,然后检查当前节点的子节点是否指向任何先前的祖先节点.
默认情况是节点为NULL.如果发生这种情况,函数返回.
它应该如何工作:
将节点添加到阵列
检查左子项是否为NULL.
如果不是,则将子进程与之前的每个节点进行比较.
如果发现故障,则报告.
如果不是,则以子节点作为参数调用该函数.
重复直到完成.(二叉树的rhs也一样)
问题:
代码:
void findFault(node * root){
if (root == NULL){
return;
}
arrOfNodes[index++] == root; // array of nodes
if (root->left != NULL){
for (i = 0; i < sizeof(arrOfNodes) / sizeof(node); i++){
if (ar[i] == root->left){
printf("%d", root->left);
return;
}
}
findFault(root->left);
} else …Run Code Online (Sandbox Code Playgroud) 在给定以下约束的情况下,是否有一种有效,实用的方法来迭代二叉树:
编辑:
我有一个非常简单的二叉树结构,如:
struct nmbintree_s {
unsigned int size;
int (*cmp)(const void *e1, const void *e2);
void (*destructor)(void *data);
nmbintree_node *root;
};
struct nmbintree_node_s {
void *data;
struct nmbintree_node_s *right;
struct nmbintree_node_s *left;
};
Run Code Online (Sandbox Code Playgroud)
有时我需要从另一个树中提取"树",我需要获取"提取的树"的大小,以便更新初始"树"的大小.
我在考虑两种方法:
1)使用递归函数,如:
unsigned int nmbintree_size(struct nmbintree_node* node) {
if (node==NULL) {
return(0);
}
return( nmbintree_size(node->left) + nmbintree_size(node->right) + 1 );
}
Run Code Online (Sandbox Code Playgroud)
2)以迭代方式(使用堆栈/队列)+对节点进行计数的预订/顺序/后序遍历.
你认为什么方法更像是"记忆失败证明"/表现?
还有其他建议/提示吗?
注意:我可能会在将来对我的小项目使用此实现.所以我不想意外失败:).
我遇到了完美匹配的定义:一组边缘恰好触及每个节点一次.
但是,我并没有真正理解这个定义.有人可以给我一个任何这样的优势的例子.或者可以指向一些参考.
我试图谷歌,但它没有给我任何一个例子.
我刚刚了解了Morris inorder树遍历算法.但我还没有找到任何关于此算法运行时间的分析.有人可以给出这个算法的运行时分析吗?此链接说明了Morris算法的工作原理.谢谢~~ 解释Morris inorder树遍历而不使用堆栈或递归
我试图了解二叉树属性.但我不确定一件事:
def.二叉树的状态表明:
如果对于每个节点,二元树是平衡的,则左子树中的内部节点的数量和右子树中的内部节点的数量相差最多1.
如果任何两个树离开diff,则二叉树是平衡的.深度最多1.
我问我是否这两个def.是等价的,我的意思是确定.1 statisfy Def.2,反之亦然?...对我来说似乎是......但是谁可以用例子来解释我这个属性的(非)等价?
谢谢,帕特里克
我需要在Haskell中使用堆树实现优先级队列,例如:
给出一个清单: [3,2,7,8,4,1,9]
3 is the main root
2 is its left leaf
7 is its right leaf
8 is the left leaf of 2
4 is the right leaf of 2
1 is the left leaf of 7
9 is the right leaf of 7
Run Code Online (Sandbox Code Playgroud)
如果我想堆树,那就像这样:
7 > 3 so we exchange them
8 > 2 we exchange them
8 > 7 we exchange them
9 > 3 we exchange them
9 > 8 we exchange them
Run Code Online (Sandbox Code Playgroud)
我们以这样的列表结束: [9,7,8,2,4,1,3] …
我碰到一个面试问题的规定:你将如何表示字母A,B,C,D,E,F并G在使用二叉树表示排序顺序?
这真的让我难过。如果我们将G其作为树的根,则左子树E和右子F树将是,以便右子树“大于”左子树。然后为节点E,其左孩子将是一个和右子B和F的左孩子会C和它的右子会D。
那是正确的还是其他人有不同的答案?
我在Python中有一些代码,它应该以列表的形式将所有根目录返回到二叉树中的叶子路径(例如["1-> 2-> 5","1-> 3"]).原始问题来自leetcode.
我需要帮助找出我的代码和/或替代解决方案的问题(最好是Python).对于我上面给出的示例,我的代码返回null,而它实际上应该打印我给出的列表.当你第一次看到这个问题时,我也很感激你如何解决这个问题.
这是我的代码:
def binaryTreePaths(self, root):
list1 = []
if (root == None):
return []
if (root.left == None and root.right == None):
return list1.append(str(root.val) + "->")
if (root.left != None):
list1.append(self.binaryTreePaths(root.left))
if (root.right != None):
list1.append(self.binaryTreePaths(root.right))
Run Code Online (Sandbox Code Playgroud) //Definition for a binary tree node.
public class TreeNode {
int key;
TreeNode left;
TreeNode right;
TreeNode(int x) { key = x; }
}
Run Code Online (Sandbox Code Playgroud)
给定TreeNode的总数 int n,如何生成随机分布的二叉树(我的意思是二叉树的形状随机,而不是随机键值。您可以将TreeNodes的所有键值设置为1)并返回TreeNode root。
这就是如何实现以下API:
public class RandomBinaryTree{
public TreeNode binaryTreeGenerator(int n){
}
}
Run Code Online (Sandbox Code Playgroud)
PS:例如,n = 3我希望算法每次可以随机生成以下5二进制树之一:
1 1 1 1 1
/ / / \ \ \
1 1 1 1 1 1
/ \ / \
1 1 1 1 …Run Code Online (Sandbox Code Playgroud)