通过Java以及递归算法实现二叉树及其相关操作

目录

一、二叉树的底层数据结构及操作实现方式

二、代码结构

1.MyBinaryTree:

2.Test:

三、程序源码

1.MyBinaryTree类:

(1)定义

(2)内部类TreeNode(类外定义也可以)

(3)相关方法(递归算法实现)

1)人为拼接构造一颗二叉树的方法

2)查找二叉树中是否包含值为key的节点的方法

3)前序遍历方法

4)中序遍历方法

5)后续遍历方法

6)获取二叉树中节点个数的方法

7)获取二叉树中叶子节点个数的方法

8)获取第k层(根节点层数为0)节点个数的方法

9)获取二叉树深度的方法

四、测试样例

Test类中源码如下 

测试结果如下


一、二叉树的底层数据结构及操作实现方式

        二叉树是树中的特殊类型,其任意节点的度均小于等于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以及递归算法实现二叉树及其相关操作的全部内容,如有不当敬请,敬请斧正!

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值