标签: binary-tree

二叉树节点故障

这是节点定义:

struct node{
    int data;
    stuct node * left;
    struct node * right;
};
Run Code Online (Sandbox Code Playgroud)

我要做的是列出指向祖先节点的所有节点.在发布错误的解决方案并从答案中获取建议后,我的新解决方案是:

递归遍历二叉树.将当前节点添加到节点数组,然后检查当前节点的子节点是否指向任何先前的祖先节点.

默认情况是节点为NULL.如果发生这种情况,函数返回.

它应该如何工作:

将节点添加到阵列

检查左子项是否为NULL.

如果不是,则将子进程与之前的每个节点进行比较.

如果发现故障,则报告.

如果不是,则以子节点作为参数调用该函数.

重复直到完成.(二叉树的rhs也一样)

问题:

  • 数组是存储节点的最佳选择吗?
  • 这有用吗?for(i = 0; i <sizeof(arrOfNodes)/ sizeof(node); i ++)
  • 因为函数是递归的,所以数组和数组索引不能在函数内初始化(或者它们可以是?)所以它们应该是全局的吗?
  • 有两个阵列会更好吗?(一个用于LHS,一个用于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)

c c++ binary-tree

1
推荐指数
2
解决办法
519
查看次数

迭代二进制树,无需控制堆栈或动态分配

在给定以下约束的情况下,是否有一种有效,实用的方法来迭代二叉树:

  1. 您无法控制调用堆栈,因此可能无法使用递归.所有状态必须位于迭代器/范围对象内,而不是堆栈中.
  2. 在算法的任何地方都不能使用堆分配.
  3. 树可能是不可变的,因此您无法在其中存储迭代状态.
  4. 你没有父指针.
  5. 迭代器/范围结构不能太大,以至于传递给函数是完全不合理的.

编辑:

  1. 这不是功课.我实际上正在尝试设计一个在第二个堆栈上构建二进制树的库,并对堆分配(或缺少堆分配)提供了很多保证.
  2. 树木是平衡的.(它们是AVL树.)

algorithm binary-tree iterator range data-structures

1
推荐指数
2
解决办法
436
查看次数

如何获得二叉树的大小?

我有一个非常简单的二叉树结构,如:

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)迭代方式(使用堆栈/队列)+对节点进行计数的预订/顺序/后序遍历.

你认为什么方法更像是"记忆失败证明"/表现?

还有其他建议/提示吗?

注意:我可能会在将来对我的小项目使用此实现.所以我不想意外失败:).

c performance binary-tree

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

在树中完美匹配

我遇到了完美匹配的定义:一组边缘恰好触及每个节点一次.

但是,我并没有真正理解这个定义.有人可以给我一个任何这样的优势的例子.或者可以指向一些参考.

我试图谷歌,但它没有给我任何一个例子.

algorithm tree binary-tree graph

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

Morris intime树遍历算法的运行时间

我刚刚了解了Morris inorder树遍历算法.但我还没有找到任何关于此算法运行时间的分析.有人可以给出这个算法的运行时分析吗?此链接说明了Morris算法的工作原理.谢谢~~ 解释Morris inorder树遍历而不使用堆栈或递归

algorithm binary-tree

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

二叉树属性 - 平衡

我试图了解二叉树属性.但我不确定一件事:

def.二叉树的状态表明:

  1. 如果对于每个节点,二元树是平衡的,则左子树中的内部节点的数量和右子树中的内部节点的数量相差最多1.

  2. 如果任何两个树离开diff,则二叉树是平衡的.深度最多1.

我问我是否这两个def.是等价的,我的意思是确定.1 statisfy Def.2,反之亦然?...对我来说似乎是......但是谁可以用例子来解释我这个属性的(非)等价?

谢谢,帕特里克

algorithm binary-tree

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

在haskell中将树转换为堆

我需要在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] …

binary-tree haskell priority-queue

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

使用二叉树对字母排序

我碰到一个面试问题的规定:你将如何表示字母ABCDEFG在使用二叉树表示排序顺序?

这真的让我难过。如果我们将G其作为树的根,则左子树E和右子F树将是,以便右子树“大于”左子树。然后为节点E,其左孩子将是一个和右子BF的左孩子会C和它的右子会D

那是正确的还是其他人有不同的答案?

algorithm binary-tree data-structures

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

在二叉树中查找所有根到叶子路径(在Python中)

我在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)

python recursion binary-tree

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

给定节点号,如何随机生成二叉树?

//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)

java algorithm binary-tree

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