ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何在不访问每个节点的情况下计算完整二叉树中的节点数?

2019-06-23 04:49:42  阅读:226  来源: 互联网

标签:java algorithm binary-tree bitwise-operators


我有一个简单的解决方案来计算完整二叉树中的节点数:

public int countNodes(TreeNode root) {
    if (root == null) { return 0; }
    return 1 + countNodes(root.left) + countNodes(root.right);
}

我理解这一点.但是,我知道它必须访问每个节点是低效的.我有另一种在线发现的解决方案:

public int countNodes(TreeNode root) {
    if(root==null)
        return 0;

    int left = getLeftHeight(root)+1;    
    int right = getRightHeight(root)+1;

    if(left==right){
        return (2<<(left-1))-1; //having a hard time here
    }else{
        return countNodes(root.left)+countNodes(root.right)+1;
    }
}

public int getLeftHeight(TreeNode n){
    if(n==null) return 0;

    int height=0;
    while(n.left!=null){
        height++;
        n = n.left;
    }
    return height;
}

public int getRightHeight(TreeNode n){
    if(n==null) return 0;

    int height=0;
    while(n.right!=null){
        height++;
        n = n.right;
    }
    return height;
}

我理解这一点,但我不完全确定我理解条件if(leftHeight == rightHeight).这是如何运作的?另外,有人可以解释按位操作以及为什么这样做的原因?我不熟悉按位运算符.也许,如果有人可以用非按位代码替换那个条件,并翻译那些将会是完美的!

解决方法:

我们知道的树的子树中的条件(leftHight == rightHight)是完整的树意味着当前子树是perfect(完整)二叉树.在完美的二叉树中,除了没有子节点的叶节点之外,每个节点都有两个子节点.

按位语句(2<<(left-1)) - 1与Math.pow(2,left)-1相同.
一般来说,2的幂可以计算如下:

2<<0 //equals 2 to the power of 1. 2 is shifted zero bits to the left
2<<1 //equals 2 to the power of 2, 2 is shifted 1 bit to the left
2<<2 // equals 2 to the power of 3, 2 is shifted 2 bits to the left
2<<k // equals 2 to the power of k+1, 2 is shifted k bits to the left

现在,如果你看一下上面的链接,你会发现高度为h的完美二叉树中的节点数是(2 **(k 1)) – 1.这是(k 1)减去1的幂的2.

在上面的代码中,左边是高度1,注意代码中的加号.因此(2<<(left-1)) - 1实际上正在计算该完美二叉树中的节点数.

标签:java,algorithm,binary-tree,bitwise-operators
来源: https://codeday.me/bug/20190623/1267509.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有