Java 求二叉树的结点数、叶子结点数、高度

代码里的二叉树长这个样子↓↓↓
在这里插入图片描述

1、构造二叉树
2、(1)求二叉树里有多少个结点
——(2)子问题思路—求结点个数(左子树+右子树+根结点的个数)
3、(1)求二叉树里有多少个叶子结点
——(2)子问题思路—求叶子结点个数
4、求二叉树的高度
5、求第k层的结点数。

import java.util.*;
import java.util.Queue;
//下面的所有求结点总数的,和求叶子结点个数的题,均使用的遍历方法是前序遍历
class Node{
    public char val;
    public Node left;//左孩子
    public Node right;//右孩子
    //为什么把val的类型定义为char类型,输出的就是字母呢???定义为int类型输出的就是ASCII码对应的值???
    //首先因为你蠢,其次,一棵二叉树结点的值本来是字母,你把val定义为整型的,它不输出数字,难道输出字母吗?
    //要输出字母肯定要定义为字符类型啊!!!<=我犯的错误=>特别容易忽视的问题!
    public Node(char val){
        this.val=val;
    }
}
public class BinaryTree {
    /*private static class Node {  //这些参数定义在在类方法外或者内都可以,只是有些需稍加修改
            char val;
            Node left;
            Node right;

            public Node(char val) {
                this.val = val;
            }
        }*/
    // 1、构造二叉树
    public Node buildTree(){
        Node A=new Node('A');
        Node B=new Node('B');
        Node C=new Node('C');
        Node D=new Node('D');
        Node E=new Node('E');
        Node F=new Node('F');
        Node G=new Node('G');
        Node H=new Node('H');
        A.left=B;A.right=C;B.left=D;B.right=E;//这里是构造二叉树的关键
        C.left=F;C.right=G;E.right=H;
        return A;
    }

    // 2、(1)求二叉树里有多少个结点
    public static int size=0;//记录结点个数
    public void getSize(Node root){
        if(root==null){
            return;
        }
        size++;//因为在前序遍历时所有的结点都会访问到,所以每访问一个结点,就size++
        getSize(root.left);
        getSize(root.right);
    }
    // (2)子问题思路—求结点个数(左子树+右子树+根结点的个数)
    public int getSize1(Node root){
        if(root==null){
            return 0;
        }
        int left=getSize1(root.left);//左子树的结点
        int right=getSize1(root.right);//右子树的结点
        return left+right+1;//整棵树的结点个数
    }

    // 3、(1)求二叉树里有多少个叶子结点
    public static int leafSize=0;//记录叶子结点的个数
    public void getLeafSize(Node root){
        if(root==null){
            return;
        }
        if(root.left==null&&root.right==null){//当当前根结点的左右孩子均为空时,该根结点就是一个叶子结点
            leafSize++;//所以++
        }else{//否则的话就继续遍历,继续找左右孩子均为空的结点,找到了就++
            getLeafSize(root.left);
            getLeafSize(root.right);
        }
    }
    // (2)子问题思路—求叶子结点个数
    public int getLeafSize1(Node root){//把左子树和右子树上的叶子结点加起来的和就是叶子结点的总数
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 1;
        }else{
            return getLeafSize1(root.left)+getLeafSize1(root.right);//如果它有左右子树,那它一定不是叶子结点
        }
    }

    // 4、求二叉树的高度
    public int getHeight(Node root){
        if(root==null){
            return 0;
        }
        int left=getHeight(root.left);
        int right=getHeight(root.right);
        return Math.max(left,right)+1;
    }

    // 5、求第k层的结点数。k>=1,如果k<1,方法无法处理
    public int getKLevel(Node root,int k){
        if(root==null){
            return 0;
        }
        if(k==1){
            return 1;
        }
        return getKLevel(root.left,k-1)+getKLevel(root.right,k-1);
    }


    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();
        Node root=binaryTree.buildTree();
        binaryTree.getSize(root);
        System.out.println("结点的个数为:"+binaryTree.size);
        binaryTree.getSize1(root);
        System.out.println("结点的个数为1:"+binaryTree.size);

        //size 和 leafSize是在方法外定义的

        binaryTree.getLeafSize(root);
        System.out.println("叶子结点的个数为:"+binaryTree.leafSize);
        binaryTree.getLeafSize1(root);
        System.out.println("叶子结点的个数为1:"+binaryTree.leafSize);

        System.out.println("二叉树的高度为:"+binaryTree.getHeight(root));

        System.out.println("第k层的结点数为:"+binaryTree.getKLevel(root,3));
    }
}

执行结果:
在这里插入图片描述

  • 11
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值