目录
一、二叉树的底层数据结构及操作实现方式
二叉树是树中的特殊类型,其任意节点的度均小于等于2,即整棵树的度小于等于2。依据底层数据结构的实现方式,二叉树分为顺序二叉树(通过顺序表实现)和链式二叉树(通过链表实现),本文将给出链式二叉树及其相关操作的实现方式。
由于二叉树任意节点的度都小于2,所以若通过链表实现二叉树,节点定义只需包括三部分:值域val,左子女引用left,右子女引用right。
由于树形数据结构本身就是递归结构(即一颗树的任意一颗子树又是一颗树),所以关于二叉树的若干操作使用递归算法将会非常便捷。
二、代码结构
1.MyBinaryTree:
定义内部类TreeNode并且实现二叉树以及相关方法。
2.Test:
在其main方法中对二叉树操作进行演示。
三、程序源码
1.MyBinaryTree类:
(1)定义
public class MyBinaryTree
(2)内部类TreeNode(类外定义也可以)
//定义内部类TreeNode
static class TreeNode{
public char val;
public TreeNode left;
public TreeNode right;
//TreeNode的构造方法
public TreeNode(char val){
this.val=val;
}
}
(3)相关方法(递归算法实现)
1)人为拼接构造一颗二叉树的方法
//人为拼接构造一颗二叉树的方法
public TreeNode creatTree(){
TreeNode A=new TreeNode('A');
TreeNode B=new TreeNode('B');
TreeNode C=new TreeNode('C');
TreeNode D=new TreeNode('D');
TreeNode E=new TreeNode('E');
TreeNode F=new TreeNode('F');
TreeNode G=new TreeNode('G');
TreeNode H=new TreeNode('H');
TreeNode I=new TreeNode('I');
A.left=B;
A.right=C;
B.left=D;
B.right=E;
C.left=F;
C.right=G;
E.right=H;
F.left=I;
return A;//返回根节点A
}
2)查找二叉树中是否包含值为key的节点的方法
//查找二叉树中是否包含值为key的节点的方法
public TreeNode find(TreeNode root,char key){
//空节点返回空
if(root==null){
return null;
}
//找到key值节点则返回
if(root.val==key){
return root;
}
//递归左子树
TreeNode leftVal=find(root.left,key);
if(leftVal!=null){
return leftVal;
}
//递归右子树
TreeNode rightVal=find(root.right,key);
if(rightVal!=null){
return rightVal;
}
//程序全部运行结束说明没有招到值为key的节点
return null;
}
3)前序遍历方法
//前序遍历方法
public void preOrder(TreeNode root){
//空节点返回
if(root==null){
return;
}
//打印根节点
System.out.print(root.val+" ");
//递归左子树
preOrder(root.left);
//递归右子树
preOrder(root.right);
}
4)中序遍历方法
//中序遍历方法
public void inOrder(TreeNode root){
//空节点返回
if(root==null){
return;
}
//递归左子树
inOrder(root.left);
//打印根节点
System.out.print(root.val+" ");
//递归右子树
inOrder(root.right);
}
5)后续遍历方法
//后序遍历方法
public void postOrder(TreeNode root){
//空节点返回
if(root==null){
return;
}
//递归左子树
postOrder(root.left);
//递归右子树
postOrder(root.right);
//打印根节点
System.out.print(root.val+" ");
}
6)获取二叉树中节点个数的方法
//获取树中的节点个数的方法
public int getSize(TreeNode root){
//空节点返回0
if(root==null){
return 0;
}
//递归左子树和右子树(+1为根节点个数)
int size=1+getSize(root.left)+getSize(root.right);
return size;
}
7)获取二叉树中叶子节点个数的方法
//获取二叉树中叶子节点个数的方法
public int getLeafNodeCount(TreeNode root){
//空节点返回0
if(root==null){
return 0;
}
//叶子节点返回1
if(root.left==null&&root.right==null){
return 1;
}
//递归左子树和右子树
int count=getLeafNodeCount(root.left)+getLeafNodeCount(root.right);
return count;
}
8)获取第k层(根节点层数为0)节点个数的方法
//获取第k层(根节点层数为0)的节点个数的方法
public int getKthLevelNodeCount(TreeNode root,int k){
//空节点返回0
if(root==null){
return 0;
}else if(k==0){
//本层节点返回1
return 1;
}
//递归左子树和右子树
return getKthLevelNodeCount(root.left,k-1)+getKthLevelNodeCount(root.right, k);
}
9)获取二叉树深度的方法
//获取二叉树的深度的方法
public int getHight(TreeNode root){
//空节点返回-1
if(root==null){
return -1 ;
}
//递归左子树
int leftHeight=getHight(root.left);
//递归右子树
int rightHeight=getHight(root.right);
//返回其中最大值
return leftHeight>rightHeight?leftHeight+1:rightHeight+1;
}
四、测试样例
Test类中源码如下
public class Test {
public static void main(String[] args) {
MyBinaryTree myBinaryTree=new MyBinaryTree();
MyBinaryTree.TreeNode root=myBinaryTree.creatTree();
//查找二叉树中是否包含值为key的节点
System.out.println(myBinaryTree.find(root,'A').val);
System.out.println("**********************************");
//前序遍历
myBinaryTree.preOrder(root);
System.out.println();
System.out.println("**********************************");
//中序遍历
myBinaryTree.inOrder(root);
System.out.println();
System.out.println("**********************************");
//后序遍历
myBinaryTree.postOrder(root);
System.out.println();
System.out.println("**********************************");
//获取节点个数
System.out.print(myBinaryTree.getSize(root));
System.out.println();
System.out.println("**********************************");
//获取叶子节点个数
System.out.print(myBinaryTree.getLeafNodeCount(root));
System.out.println();
System.out.println("**********************************");
//获取第k层节点个数
System.out.print(myBinaryTree.getKthLevelNodeCount(root,3));
System.out.println();
System.out.println("**********************************");
//获取二叉树的深度
System.out.print(myBinaryTree.getHight(root));
System.out.println();
}
}
测试结果如下
以上便是通过java以及递归算法实现二叉树及其相关操作的全部内容,如有不当敬请,敬请斧正!