已知一棵完全二叉树,求其节点的个数

已知一棵完全二叉树,求其节点的个数
要求:时间复杂度低于O(N),N为这棵树的节点个数

思路

满二叉树:层数为 l l l,节点个数为 2 l − 1 2^l-1 2l1

  • 从根节点出发,一路遍历其左孩子可以得到该二叉树的高度 h h h
  • 从该二叉树的右孩子节点开始遍历其左孩子可以得到该部分二叉树可以到达的最深的层数,如果可以到达 h h h层,那么左子树是满二叉树,可以得到节点数,右子树不是满二叉树,对其进行递归;如果右子树不能到达 h h h层,那么右子树是满二叉树,可以得到节点数,对左子树进行递归。

代码

package BinaryTree;

public class CompleteTreeNodeNumber {

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

    public static int NodeNumber(Node head){
        if (head==null){
            return 0;
        }
        return bs(head,1,mostLeftLevel(head,1));
    }

    //level:当前节点所在的层,h:所求二叉树的总层数
    public static int bs(Node head,int level,int h){
        if (level==h){
            return 1;
        }
        if (mostLeftLevel(head.right,level+1)==h){
            //右子树到达h层,则左子树是满的,层数是h-level
            return (1<<(h-level))+bs(head.right,level+1,h);
        }else {//右子树没有到达h层,则右子树是满的但层数是h-level-1
            return (1<<(h-level-1))+bs(head.left,level+1,h);
        }
    }

	//当前节点最左边节点能到达的深度,level:当前节点所在的深度
    public static int mostLeftLevel(Node head,int level){
        while (head!=null){
            level++;
            head=head.left;
        }
        return level-1;
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.left = new Node(2);
        head.right = new Node(3);
        head.left.left = new Node(4);
        head.left.right = new Node(5);
        head.right.left = new Node(6);
        System.out.println(NodeNumber(head));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值