精华内容
下载资源
问答
  • 查了圈网上现有的资料,基本都是“天下文章大抄”或者过时、甚至无法运行的代码,也没有讲明原理,代码质量烂得一比,怒而亲自动手。

    查了一圈网上现有的资料,基本都是“天下文章一大抄”或者过时、甚至无法运行的代码,也没有讲明原理,代码质量烂得一比,怒而亲自动手。


    思路很简单:

    1. 初始化N个树节点,每次随机从中选出一个父节点和子节点,随机决定子节点作为父节点的左叶或右叶;
    2. 特别的,使用并查集来避免出现构建回环的情况;(并查集的相关知识请参考《算法4》)
    3. 考虑到每个节点最多只会有一个入度和两个出度,因此可以添加父、子节点的待选列表,解决随机碰撞影响效率的问题。

    给出对树节点的结构定义:

    class TreeNode:
        def __init__(self, value=None):
            self.v = value
            self.left, self.right = None, None
            self.father = None
    

    上述思路的具体实现,请参考以下代码及详实的注释来理解:

    def build_random_tree(n):
        """
        构建一棵随机树
        :param n: 树的节点总数
        :return: 所有节点的list(根节点为list的第一个元素)
        """
        assert n > 1
        import random as r
        all_nodes = [[0, TreeNode(i + 1)] for i in range(n)]  # (出度, 节点)
        in_nodes = [i for i in range(n)]  # in < 1 的点,待选作为子节点的列表
        out_nodes = [i for i in range(n)]  # out < 2 的点,待选作为父节点的列表
        uf = [i for i in range(n)]  # 并查集联通表
    
        def uf_find(x):  # 并查集辅助函数
            return x if x == uf[x] else uf_find(uf[x])
    
        def uf_union(i, j):  # 并查集辅助函数
            if r.random() > 0.5:  # 均衡并查集的查找树高
                i, j = j, i
            uf[uf_find(i)] = uf_find(j)
    
        while len(in_nodes) > 1:
            fa_id = out_nodes[r.randint(0, len(out_nodes) - 1)]  # 任意挑选一个节点作为父节点
            ch_id = in_nodes[r.randint(0, len(in_nodes) - 1)]  # 为其随机挑选一个子节点
    
            if uf_find(fa_id) == uf_find(ch_id):  # 防止回环
                continue
    
            fa, ch = all_nodes[fa_id], all_nodes[ch_id]
    
            if fa[0] == 0:  # 父节点出度为0时,随机决定ch其成为左/右节点
                if r.random() > 0.5:
                    fa[1].left = ch[1]
                else:
                    fa[1].right = ch[1]
                fa[0] += 1  # 出度加一
            elif fa[0] == 1:  # 父节点出度为1时,ch成为其不为空的子节点
                if fa[1].left:
                    fa[1].right = ch[1]
                elif fa[1].right:
                    fa[1].left = ch[1]
                out_nodes.remove(fa_id)  # 同时,fa已拥有左右儿子,可以从待选父节点中删去
    
            ch[1].father = fa[1]  # 构建父指针
            uf_union(fa_id, ch_id)  # 在并查集中联通父子节点
    
            in_nodes.remove(ch_id)  # 从合法子节点中删去
    
        root = all_nodes[in_nodes[0]][1]  # root_id = in_nodes[0], 入节点列表中唯一剩下的节点就是根节点
        nodes = map(lambda nd: nd[1], filter(lambda x: x[1] != root, all_nodes))  # 构建除root外所有节点的列表
        return [root] + list(nodes)  # 所有节点的list(根节点为list的第一个元素)
    
    展开全文
  • 当每非终端节点均含有m孩子节点时间,此时整棵树在所有含有n个节点的m叉中是最矮胖的,此时这棵树的高度也是含有n个节点m叉中高度最低。在极限的状态下可以称之为满m叉,因此可以推导不等式,得出最低高度...

    一、最大高度

    试想一下,若有n个节点的度为m的树,当只有最后一层有m个节点,其余层均只有一个节点,在所有含有nn个节点的度为m的树中一定是最高的。
    在这里插入图片描述

    二、最低高度

    当每个非终端节点均含有m个孩子节点时间,此时整棵树在所有含有n个节点的度为m的树中是最矮胖的,此时这棵树的高度也是含有n个节点度为m的树中高度最低。在极限的状态下可以称之为满m叉树,因此可以推导不等式,得出最低高度。
    在这里插入图片描述

    结论:综上分析,对于一个含有n个节点的度为m的树的高度范围为:ceil(logm((m-1)*n + 1) <= h <= n-m+1

    展开全文
  • 具有n个节点的二叉树有多少种形态

    千次阅读 2018-11-02 21:05:37
    1)先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1 (2)如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,左右子树的分布情况为1=1+0=0+1,故...

    【n个节点的二叉树有多少种形态(Catalan数)】

    分析过程:
    (1)先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1

    (2)如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,左右子树的分布情况为1=1+0=0+1,故有f(2) = f(1) + f(1)

    (3)如果有三个节点,(我们需要考虑固定两个节点的情况么?当然不,因为当节点数量大于等于2时,无论你如何固定,其形态必然有多种)我们考虑固定一个节点,即根节点。好的,按照这个思路,还剩2个节点,那么左右子树的分布情况为2=2+0=1+1=0+2。
    所以有3个节点时,递归形式为f(3)=f(2) + f(1)*f(1) + f(2)。(注意这里的乘法,因为左右子树一起组成整棵树,根据排列组合里面的乘法原理即可得出)

    (4)那么有n个节点呢?我们固定一个节点,那么左右子树的分布情况为n-1=n-1 + 0 = n-2 + 1 = … = 1 + n-2 = 0 + n-1。此时递归表达式为f(n) = f(n-1) + f(n-2)f(1) + f(n-3)f(2) + … + f(1)f(n-2) + f(n-1)

    接下来我们定义没有节点的情况,此时也只有一种情况,即f(0)=1
    那么则有:
    f(0)=1,f(1)=1
    f(2)=f(1)f(0)+f(0)f(1)
    f(3)=f(2)f(0)+f(1)f(1)+f(0)f(2)
    .
    .
    .
    .
    f(n)=f(n-1)f(0)+f(n-2)f(1)+……….+f(1)f(n-2)+f(0)f(n-1)
    该数列称为卡特兰数(Catalan数),该递推关系的解为:
    这里写图片描述
    即含n个节点的二叉树有f(n)种形态。

    【其他使用Catalan数解决的问题】
    (1)矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
    (2)一个栈(无穷大)的进栈序列为1,2,3,…n,有多少个不同的出栈序列?
    (3)有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
    (4)将一个凸多边形区域分成三角形区域的方法数?
    (5)在圆上选择2n个点,将这些点成对连接起来,使得所得到的n条线段不相交的方法数。
    (6)一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

    展开全文
  • 1、问题重述:具有m结点的m叉的最小高度是? 2、解题思路,只有当这n个结点建立的m叉为满的时候,的高度才会最低。 层次 度为3时的结点数 度为m时的结点数 1 3^0 m^0 2 3^1 m^1 3 3^2

    1、问题重述:具有m个结点的m叉树的最小高度是?

    2、解题思路,只有当这n个结点建立的m叉树为满的时候,树的高度才会最低。

    层次 度为3时的结点数 度为m时的结点数

    1 3^0 m^0

    2 3^1 m^1

    3 3^2 m^2

    ………………………………………………

    i 3^(i-1) m^(i-1)

    ………………………………………………

    h 3^(h-1) m^(h-1)

    所以得到n=m0+m1+…+m(h-1)=(mh-1)/(m-1)

    解得h>=logm(n(m-1)+1)

    所以h为logm(n(m-1)+1)的上界。

    展开全文
  • 题目解析:给定一个n,用1-n这些数字去创建搜索二叉树,并将所有搜索二叉树的头结点放到vector中返回。 解题思路:好吧,这题我也说不清是怎么肥事,自己举例子画画就明白了。 class Solution { public: ...
  • n个节点n-1条边。
  • N个节点的二叉树有多少种形态

    千次阅读 2019-08-05 21:59:07
    转载自N个节点的二叉树有多少种形态 这是一道阿里的面试题。...先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1 如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑...
  • B 是二叉搜索的推广,其中每个节点n 键和 n+1 个子节点n个节点可以不同。 键的排序与二叉搜索中的排序相同。 对于键 k ,左边的所有孩子必须有小于 k 的键,右边的所有孩子都必须有键 ...
  • 题目求包含n个节点的二叉树的种类数;方法1设dp[i]表示共有i个节点时,能产生的BST的个数 n == 0 时,空的个数必然为1,因此... 当根节点元素为 1, 2, 3, 4, 5, …, i, …, n时,基于以下原则的BST树具有唯一性:
  • n个节点的二叉树有多少种形态

    千次阅读 2019-07-29 11:59:19
    1)先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1 (2)如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,左右子树的分布情况为1=1+0=0+1,...
  • 具有3结点的二叉树有几种形态? 正确答案: B 你的答案: B (正确) 4 5 6 7 解析 这是一道牛客网上的测试题,因为题目是求3个节点的二叉树的形态,所以直接手画了。...
  • 节点、度数、高度、深度、遍历

    万次阅读 多人点赞 2019-09-27 21:35:34
    1.节点的度与的度 节点的度:结点拥有的子树数目称为结点的度,叶子结点 就是度为0的结点 的度:内各结点的度的最大值 分支节点:度不为0的节点 -------------------------------------------------- ...
  • 1.n个节点的二叉树,最多可以有多少层? A.n/2 B.log(n) C.n-1 D.n 答案解析: D 假设从根节点开始,根节点的层数为1,每一个节点,则有n层。
  • 1)先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1 (2)如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,左右子树的分布情况为1=1+0=0+1,...
  • 假设完全二叉树中,度为0的节点(即叶节点)数目为n0,度为1节点数为n1,度为2的数目为n2,总数为n 首先我们得知道两公式 n = n0 + n1 + n2 n - 1 = 0*n0 + 1*n1 + 2*n2 得n0 = n2 + 1 = (n-1 - n1)/2 但我们还是...
  • 严格二叉树,这定义就百度上有,维基百科都没查到。 严格二叉树的定义:如果颗二叉树的每非终端节点都有且仅有两子树,则称这颗二叉树为严格二叉树。...首先证明一个问题,对于n个叶子的严格二叉树,必...
  • N个节点的二叉树的形态数 卡特兰数
  • n层满k叉总共有多少个节点

    千次阅读 2018-08-14 11:13:41
    (k^n-1)/(k-1)
  • 平衡二叉树又称AVL,它或者是一棵,或者是具有下列性质的二叉树:它的左子树和右子都是平衡二叉树, 且左子树和右子的深度之差的绝对值不超过1,若将二叉节点的平衡因子BF定义为该节点的左子树的深度...
  • N的最大深度

    万次阅读 2020-06-27 18:29:11
    N的最大深度(力扣:559) 给定一个 N,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
  • 给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。 最近公共祖先是两个节点的公共的祖先节点具有最大深度。 可以查看连接:https://blog.csdn.net/wenqiwenqi123/article/details/79952043 ...
  • 具有n个结点的m叉的最小高度

    万次阅读 多人点赞 2015-10-04 21:27:36
    这是《王道数据结构联考复习指导》P98,...1、问题重述:具有m结点的m叉的最小高度是? 2、解题思路,只有当这n个结点建立的m叉为满的时候,的高度才会最低。 层次 度为3时的结点数 度为m时的结点数 1 3^0 m
  • 堆排序是基于完全二叉树实现的,在将一个数组调整成一堆的时候,关键之的是确定最后一个非叶子节点的序号,这序号为n/2-1n为数组的长度。但是为什么呢? 可以分两种情形考虑: ①堆的最后一个非叶子节点若...
  • 定义f(0)= 1 当只有节点时,只会生成... 1+0 = 0+1[即左边节点右边0个节点或者左边0个节点右边1个节点]记做 f(2)= f(1)*f(0) + f{0}*f(1) = 2 当有三个节点,首先固定根基点,剩下3-1=2个节点的安放位置:2= 2
  • N个节点的二叉树有多少种形态   这是一道阿里的面试题。其实算不上新鲜,但是我之前没关注过,...先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1 如果有两个节点呢?我们很自然想到,应该...
  • 二叉树总结:入口 ...5、判断一个二叉树是否是BST,判断一个BST是否是AVl 6、BST的镜像 7、把BST满足[begin,end]区间的值放在集合中、打印出来 8、判断是否是子树 9、按层打印二叉树 1、求BST...
  • 一棵完全二叉树的节点总数

    千次阅读 2019-09-01 15:06:34
    要求:时间复杂度低于O(N),N为这棵树节点个数。 公式节点个数=2^n-1 思路: 如果是一个完全二叉树最左边一定有节点求出二叉树的高度H public static int mostLeftLevel(Node node, int level) { while (node !=...
  • 我们研究具有节点和链接故障... 此外,我们在每级别上根据局部故障概率的衰减率(节点故障概率和链路故障概率的组合)得出一个充要条件,以确保具有节点故障和链路故障的的检测错误概率衰减像一样快,没有故障。
  • #include <stdio.h> #include <string.h> #include <malloc.h> #define M 20 typedef struct BTNode{ char c; struct BTNode *lchild,*rchild;...//在祖先中找结点 BTNodep

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,251
精华内容 47,300
关键字:

对于一棵具有n个节点的树