您的位置:主页 > 新闻资讯 > 公司动态 >

公司动态

计算它的节点个数,你会不会吗?(下)

计算它的节点个数,你会不会吗?(下)

如果让你数一棵普通二叉树有多少个节点,这个很简单。只需在二叉树的遍历框架中添加一点代码即可。

斯里兰卡普提树寺转树仪式_树的特点_含树 反含树

但是如果给你一棵完整的二叉树,并要求你计算它的节点数,你会吗?算法的时间复杂度是多少?这个算法的时间复杂度应该是O(logN*logN)。如果你心目中的算法效率不高,那么这篇文章就是为你而写的。

树的特点_斯里兰卡普提树寺转树仪式_含树 反含树

扯远了计算它的节点个数,你会不会吗?(下),关于这两个定义,中文语境和英文语境似乎有些不同。我们说的完全二叉树对应的是英文Complete Binary Tree,是没有问题的。但是我们说的全二叉树对应的是英文Perfect Binary Tree,英文全二叉树是指二叉树的所有节点要么没有子节点,要么有两个子节点。

斯里兰卡普提树寺转树仪式_含树 反含树_树的特点

public int countNodes(TreeNode root) {
    TreeNode l = root, r = root;
    // 记录左、右子树的高度
    int hl = 0, hr = 0;
    while (l != null) {
        l = l.left;
        hl++;
    }
    while (r != null) {
        r = r.right;
        hr++;
    }
    // 如果左右子树的高度相同,则是一棵满二叉树
    if (hl == hr) {
        return (int)Math.pow(2, hl) - 1;
    }
    // 如果左右高度不同,则按照普通二叉树的逻辑计算
    return 1 + countNodes(root.left) + countNodes(root.right);
}

树的特点_含树 反含树_斯里兰卡普提树寺转树仪式

由于完全二叉树的性质树的特点,它的一个子树必须是满的,所以会触发hl == hr,只消耗O(logN)复杂度,无需继续递归。

综上所述树的特点仿真松树,算法的递归深度为树的高度O(logN)仿真紫藤花树,每次递归所花费的时间为while循环,需要O(logN),所以整体时间复杂度为O (logN*logN)。

公司动态

联系我们

QQ:1701281808

手机:13316655721

电话:13316655721

邮箱:1701281808@qq.com

地址:河南省郑东新区电子商务大厦A塔5层

用手机扫描二维码关闭