算法题0009 | 求完全二叉树结点个数

Posted Explosive

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题0009 | 求完全二叉树结点个数相关的知识,希望对你有一定的参考价值。

1.题目

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

2.要求

时间复杂度低于O(N),N为这棵树的结点个数。

3.解法

注:可利用满二叉树结点数的公式: n=2^l-1(l为二叉树的深度) 先求二叉树的深度,然后二叉树的右孩子的最左结点的深度,进行if判断:

  • 如果与二叉树深度相同,那么该二叉树的左孩子表示的二叉树为满二叉树;

  • 如果与二叉树深度不同,那么该二叉树的右孩子表示的二叉树为满二叉树。

 
   
   
 
  1. package com.bingo.tree;

  2. /**

  3. * 已知一棵完全二叉树,求其结点个数。

  4. * 要求:时间复杂度低于O(N),N为这棵树的结点个数

  5. *

  6. * @author ylb

  7. *

  8. */

  9. public class CompleteTreeNodeNumber {

  10.    public static class Node {

  11.        public int value;

  12.        public Node left;

  13.        public Node right;

  14.        public Node(int data) {

  15.            this.value = data;

  16.        }

  17.    }

  18.    /**

  19.     * 主函数,求结点个数nodeNum

  20.     * @param head

  21.     * @return

  22.     */

  23.    public static int nodeNum(Node head) {

  24.        if (head == null) {

  25.            return 0;

  26.        }

  27.        return bs(head, 1, mostLeftLevel(head, 1));

  28.    }

  29.    /**

  30.     *

  31.     * @param node 当前结点

  32.     * @param level 当前结点所在的层

  33.     * @param h 树的深度

  34.     * @return node结点表示的树的结点个数

  35.     */

  36.    public static int bs(Node node, int level, int h) {

  37.        if (level == h) {

  38.            // level == h,表示结点所在的层与树的深度相等,说明结点为叶结点

  39.            // 返回结点表示的树的结点数1

  40.            return 1;

  41.        }

  42.        if (mostLeftLevel(node.right, level + 1) == h) {

  43.            // 结点的右孩子的最左结点深度与树的深度相等,说明结点的左孩子表示的树为满二叉树

  44.            return (1 << (h - level)) + bs(node.right, level + 1, h);

  45.        } else {

  46.            // 结点的右孩子的最左结点深度与树的深度不等,说明结点的右孩子表示的树为满二叉树

  47.            return (1 << (h - level - 1)) + bs(node.left, level + 1, h);

  48.        }

  49.    }

  50.    /**

  51.     *

  52.     * @param node 当前结点

  53.     * @param level 当前结点所在的层

  54.     * @return 当前结点表示的树的深度

  55.     */

  56.    public static int mostLeftLevel(Node node, int level) {

  57.        while (node != null) {

  58.            ++level;

  59.            node = node.left;

  60.        }

  61.        return level - 1;

  62.    }

  63. }


以上是关于算法题0009 | 求完全二叉树结点个数的主要内容,如果未能解决你的问题,请参考以下文章

关于统计二叉树中度数为一的结点个数算法很不理解 求高手赐教!!! 详细点

通过二分查找+位运算求完全二叉树的节点个数

C++如何求二叉树中一个结点到根节点的路径?

求代码:实现二叉树中所有结点左右子树的交换

java数据结构二叉树查找结点操作,递归调用求详细讲解

编写一个程序,实现二叉树的各种基本运算