代码里的二叉树长这个样子↓↓↓
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));
}
}
执行结果: