二叉树的操作之统计二叉树中节点的个数

一,问题描述

给定一颗二叉树,已知其根结点。

①计算二叉树所有结点的个数

②计算二叉树中叶子结点的个数

③计算二叉树中满节点(度为2)的个数

二,算法分析

找出各个问题的基准条件,然后采用递归的方式实现。

①计算二叉树所有结点的个数

1)当树为空时,结点个数为0,否则为根节点个数 加上 根的左子树中节点个数 再加上 根的右子树中节点的个数

借助遍历二叉树的思路,每访问一个结点,计数增1。因此,可使用类似于先序遍历的思路来实现,代码如下:

//计算树中节点个数
    private int nubmerOfNodes(BinaryNode<T> root){
        int nodes = 0;
        if(root == null)
            return 0;
        else{
            nodes = 1 + nubmerOfNodes(root.left) + nubmerOfNodes(root.right);
        }
        return nodes;
    }

  

计算树中节点个数的代码方法与计算树的高度的代码非常相似!

//求二叉树的深度
   public static int deep(Node node){
    int h1, h2;
       if(node == null)
         {return 0;
         }
       else{
   h1= deep(node.left);
   h2= deep(node.right);
     return (h1<h2)?h2+1:h1+1;
       }

   }

  

②计算叶子结点的个数

1)当树为空时,叶子结点个数为0

2)当某个节点的左右子树均为空时,表明该结点为叶子结点,返回1

3)当某个节点有左子树,或者有右子树时,或者既有左子树又有右子树时,说明该节点不是叶子结点,因此叶结点个数等于左子树中叶子结点个数 加上 右子树中叶子结点的个数

//计算树中叶结点的个数
    private int numberOfLeafs(BinaryNode<T> root){
        int nodes = 0;
        if(root == null)
            return 0;
        else if(root.left == null && root.right == null)
            return 1;
        else
            nodes = numberOfLeafs(root.left) + numberOfLeafs(root.right);
        return nodes;
    }

  

③计算满节点的个数(对于二叉树而言,满节点是度为2的节点)

满节点的基准情况有点复杂:

1)当树为空时,满节点个数为0

2)当树中只有一个节点时,满节点个数为0

3)当某节点只有左子树时,需要进一步判断左子树中是否存在满节点

4)当某节点只有右子树时,需要进一步判断右子树中是否存在满节点

5)当某节点即有左子树,又有右子树时,说明它是满结点。但是由于它的左子树或者右子树中可能还存在满结点,因此满结点个数等于该节点加上该节点的左子树中满结点的个数 再加上 右子树中满结点的个数。

//计算树中度为2的节点的个数--满节点的个数
    private int numberOfFulls(BinaryNode<T> root){
        int nodes = 0;
        if(root == null)
            return 0;
        else if(root.left == null && root.right == null)
            return 0;
        else if(root.left == null && root.right != null)
            nodes = numberOfFulls(root.right);
        else if(root.left != null && root.right == null)
            nodes = numberOfFulls(root.left);
        else
            nodes = 1 + numberOfFulls(root.left) + numberOfFulls(root.right);
        return nodes;
    }

  

对于二叉树而言,有一个公式:度为2的结点个数等于度为0的结点个数减去1。 即:n(2)=n(0)-1

故可以这样:

    private int numberOfFulls(BinaryNode<T> root){
        return numberOfLeafs(root) > 0 ? numberOfLeafs(root)-1 : 0;// n(2)=n(0)-1
    }

  三,完整程序代码如下

public class BinarySearchTree<T extends Comparable<? super T>> {

    private static class BinaryNode<T> {
        T element;
        BinaryNode<T> left;
        BinaryNode<T> right;

        public BinaryNode(T element) {
            this(element, null, null);
        }

        public BinaryNode(T element, BinaryNode<T> left, BinaryNode<T> right) {
            this.element = element;
            this.left = left;
            this.right = right;
        }

        public String toString() {
            return element.toString();
        }
    }

    private BinaryNode<T> root;

    public BinarySearchTree() {
        root = null;
    }

    public void insert(T ele) {
        root = insert(ele, root);// 每次插入操作都会‘更新‘根节点.
    }

    private BinaryNode<T> insert(T ele, BinaryNode<T> root) {
        if (root == null)
            return new BinaryNode<T>(ele);
        int compareResult = ele.compareTo(root.element);
        if (compareResult > 0)
            root.right = insert(ele, root.right);
        else if (compareResult < 0)
            root.left = insert(ele, root.left);
        else
            ;
        return root;
    }

    public int height() {
        return height(root);
    }

    private int height(BinaryNode<T> root) {
        if (root == null)
            return -1;// 叶子节点的高度为0,空树的高度为1

        return 1 + (int) Math.max(height(root.left), height(root.right));
    }

    public int numberOfNodes(BinarySearchTree<T> tree){
        return nubmerOfNodes(tree.root);
    }

    //计算树中节点个数
    private int nubmerOfNodes(BinaryNode<T> root){
        int nodes = 0;
        if(root == null)
            return 0;
        else{
            nodes = 1 + nubmerOfNodes(root.left) + nubmerOfNodes(root.right);
        }
        return nodes;
    }

    public int numberOfLeafs(BinarySearchTree<T> tree){
        return numberOfLeafs(tree.root);
    }
    //计算树中叶结点的个数
    private int numberOfLeafs(BinaryNode<T> root){
        int nodes = 0;
        if(root == null)
            return 0;
        else if(root.left == null && root.right == null)
            return 1;
        else
            nodes = numberOfLeafs(root.left) + numberOfLeafs(root.right);
        return nodes;
    }

    public int numberOfFulls(BinarySearchTree<T> tree){
        return numberOfFulls(tree.root);
        // return numberOfLeafs(tree.root) > 0 ? numberOfLeafs(tree.root)-1 : 0;// n(2)=n(0)-1
    }
    //计算树中度为2的节点的个数--满节点的个数
    private int numberOfFulls(BinaryNode<T> root){
        int nodes = 0;
        if(root == null)
            return 0;
        else if(root.left == null && root.right == null)
            return 0;
        else if(root.left == null && root.right != null)
            nodes = numberOfFulls(root.right);
        else if(root.left != null && root.right == null)
            nodes = numberOfFulls(root.left);
        else
            nodes = 1 + numberOfFulls(root.left) + numberOfFulls(root.right);
        return nodes;
    }

    public static void main(String[] args) {
        BinarySearchTree<Integer> intTree = new BinarySearchTree<>();
        double averHeight = intTree.averageHeigth(1, 6, intTree);
        System.out.println("averageheight = " + averHeight);

        /*-----------All Nodes-----------------*/
        int totalNodes = intTree.numberOfNodes(intTree);
        System.out.println("total nodes: " + totalNodes);

        /*-----------Leaf Nodes-----------------*/
        int leafNodes = intTree.numberOfLeafs(intTree);
        System.out.println("leaf nodes: " + leafNodes);

        /*-----------Full Nodes-----------------*/
        int fullNodes = intTree.numberOfFulls(intTree);
        System.out.println("full nodes: " + fullNodes);
    }

    public double averageHeigth(int tree_numbers, int node_numbers, BinarySearchTree<Integer> tree) {
        int tree_height, totalHeight = 0;
        for(int i = 1; i <= tree_numbers; i++){
            int[] randomNumbers = C2_2_8.algorithm3(node_numbers);
            //build tree
            for(int j = 0; j < node_numbers; j++)
            {
                tree.insert(randomNumbers[j]);
                System.out.print(randomNumbers[j] + " ");
            }
            System.out.println();
            tree_height = tree.height();
            System.out.println("height:" + tree_height);

            totalHeight += tree_height;
//            tree.root = null;//for building next tree
        }
    return (double)totalHeight / tree_numbers;
    }
}
时间: 2024-11-08 10:15:38

二叉树的操作之统计二叉树中节点的个数的相关文章

统计数组中重复元素个数

/** * 循环统计数组或集合中的重复元素个数 * @param args */ public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); String[] ss = {"白","黑","绿","白"}; for (int i = 0; i < ss.len

输入的数转化为二进制序列,并统计序列中1的个数

★输入的数转化为二进制序列,并统计序列中1的个数 描述:普通的模除取余后数直接除二的办法易于理解,但是对于输入的数只限于正数和零,对于负数则不适应,所以采用与后移位的方法以此来扩大数的输入范围. #include<stdio.h> int main() { int m,b,c,i; int count = 0; char a[32]; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i <

学c语言做练习之?统计文件中字符的个数

统计文件中字符的个数(采用命令行参数) #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {  char ch;  FILE *fp;  long count=0;    if(argc !=2)  {   printf("文件名是:%s\n",argv[0]);   exit(EXIT_FAILURE);  }  if ((fp=fopen(argv[1],"r

统计字符串中汉字的个数

字符串可以包括数字.字母.汉字或者其他字符.使用Charater类的isDigit()方法可以判断字符串中的某个字符是否为数字, 使用Character类的isLetter()方法可以判断字符串中的某个字符是否为字母. 本案例将介绍用"正则表达式"来判断字符串中的某个字符是否为汉字,并统计该字符串中汉字的数量. 关键技术: Java中提供Pattern用于正则表达式的编译方式,该类的静态方法matches()可以执行正则表达式的匹配.该方法的声明如下: public static bo

问题 C: c#统计字符串中数字字符的个数

题目描述 假设有一个GetNumber方法(参数为字符串strSource),编写一个静态方法可以用来统计字符串strSource中数字字符的个数. 输入 输入一个字符串strSource 输出 strSource字符串中数字字符的个数 样例输入 .wrapper {position: relative;} #input {position: absolute;top: 0;left: 0;opacity: 0;z-index: -10;} copy asffkl8asjkfjklas3jdf9

Hadoop 分析图中节点的重要性,求解图中节点三角形个数

Hadoop 求解无向图中节点的重要性,通过求解节点的三角形个数来展现: 求解图中节点重要性,并排序,在大数据,分布式处理大型图组织形式的数据时很重要,找出重要节点,并对重要节点做特殊处理是很重要的 下面讲解如何来求解 这篇文章分为三部分: 1,python生成无向图的邻接矩阵 2,python画出这个无向图 3,hadoop mapreduce 求解图中每个节点的三角形个数 关于hadoop求解矩阵相乘,请看之前的文章:http://blog.csdn.net/thao6626/article

统计整数中1的个数

题目:给定一个无符号整数x,求x的二进制表示中1的个数. 分析: 看到二进制,基本上就各种位运算的骚操作吧. 算法一: 最容易想到的,不断除2,并进行统计. 算法二: 如果已知大多数数据位是 0 的话,那么还有更快的算法,这个算法基于一个事实:x&(x-1)会消掉最后一个1. 算法三: 分治法,均分成两半,1的个数=左边1的个数+右边1的个数. #include<bits/stdc++.h> using namespace std; typedef unsigned int uint;

统计字符串中单词的个数

1.单纯统计单词个数,单词与单词之间只考虑空格的情况 // word_statistic.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string> using namespace std; #define M 10000 #define N 20 int _tmain(int argc, _TCHAR* argv[]) { char str1[M]={0};

关于统计字符串中重复字符个数

一般使用map集合的键不唯一来统计 map.containsKey(b)//判断map集合键中是否包含b 若果不包含就将b作为键存入集合中值为1 map.put(b,1); 如果键中包含那么键不变,值在原来的基础上加1 map.put(b,map.get(key)+1); 代码展现 for(Character key : keySet){ if(!map.contiansKey(b)){ map.put(b,1); }else{ map.put(b,map.get(key)+1); } }