二叉树的概念

二叉树

任何一个节点的子节点的数量不超过2。二叉树的子节点分为左节点和右节点。
满二叉树:所有子节点的都在最后一层,而且节点的总数为 2 n − 1 2^n-1 2n1,n是树的高度。

完全二叉树:所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二节的叶子节点在右边连续。

二叉树的存储结构

链式存储:
在这里插入图片描述

代码

首先,创建树节点,每个树节点包含三个成员变量:1.数值 2.左节点的引用 3.右节点的引用

TreeNode类(节点类)

package com.wuxudong.BinaryTree;

//树的节点
public class TreeNode {

    private int data;

    public TreeNode(int data){
        this.data=data;
    }

    //左右节点
    private TreeNode leftNode;

    private TreeNode righNode;

    public void setData(int data) {
        this.data = data;
    }

    public void setLeftNode(TreeNode leftNode) {
        this.leftNode = leftNode;
    }

    public void setRighNode(TreeNode righNode) {
        this.righNode = righNode;
    }

    public int getData() {
        return data;
    }

    public TreeNode getLeftNode() {
        return leftNode;
    }

    public TreeNode getRighNode() {
        return righNode;
    }
}

然后,创建二叉树的类,包含一个成员变量,就是一个根节点对象

BinaryTree类(二叉树类)

package com.wuxudong.BinaryTree;

public class BinaryTree {

    //根节点
    private TreeNode rootNode;

    public TreeNode getRootNode() {
        return rootNode;
    }

    public void setRootNode(TreeNode rootNode) {
        this.rootNode = rootNode;
    }
}

最后创建一个二叉树:

MyBinaryTree类(二叉树的具体实现类)

package com.wuxudong.BinaryTree;

public class MyBinaryTree {
    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();

        //创建一个节点
        TreeNode rootNode=new TreeNode(1);
        //将节点作为根节点
        binaryTree.setRootNode(rootNode);

        //创建左节点
        TreeNode lNode=new TreeNode(2);
        //创建右节点
        TreeNode rNode=new TreeNode(3);

        //设置左节点
        rootNode.setLeftNode(lNode);

        //设置右节点
        rootNode.setRighNode(rNode);

        //为第二层的左节点创建两个子节点
        lNode.setLeftNode(new TreeNode(4));
        lNode.setRighNode(new TreeNode(5));

        rNode.setLeftNode(new TreeNode(6));
        rNode.setRighNode(new TreeNode(7));
}

以上,我们创建了一个如下图所示的二叉树:
在这里插入图片描述

二叉树的遍历:前序遍历,中序遍历,后序遍历

主要用了递归的思想

前序遍历:根,左节点,右节点
中序遍历:左节点,根,右节点
后序遍历:左节点,右节点,根

二叉树的删除

分两种情况
1)如果删除的是根节点,则让根节点的引用指向为空。
2)如果删除的不是根节点,判断是否是根节点的左节点,如果是则删除,并将根节点的左节点作为根节点删除左子树,删完左子树后,将根节点的右节点作为根节点删除右子树。如果不是,将左节点作为根节点继续递归删除。右节点同理

代码:

MyBinaryTree类

package com.wuxudong.BinaryTree;

public class MyBinaryTree {
    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();

        //创建一个节点
        TreeNode rootNode=new TreeNode(1);
        //将节点作为根节点
        binaryTree.setRootNode(rootNode);

        //创建左节点
        TreeNode lNode=new TreeNode(2);
        //创建右节点
        TreeNode rNode=new TreeNode(3);

        //设置左节点
        rootNode.setLeftNode(lNode);

        //设置右节点
        rootNode.setRighNode(rNode);

        //为第二层的左节点创建两个子节点
        lNode.setLeftNode(new TreeNode(4));
        lNode.setRighNode(new TreeNode(5));

        rNode.setLeftNode(new TreeNode(6));
        rNode.setRighNode(new TreeNode(7));

        //前序遍历
        binaryTree.frontShow();
        //中序遍历
        binaryTree.midShow();
        //后序遍历
        binaryTree.aftShow();
		//删除节点
        binaryTree.delete(4);
        binaryTree.frontShow();

    }
}

BinaryTree类

package com.wuxudong.BinaryTree;

public class BinaryTree {

    //根节点
    private TreeNode rootNode;

    public TreeNode getRootNode() {
        return rootNode;
    }

    public void setRootNode(TreeNode rootNode) {
        this.rootNode = rootNode;
    }

    //前序遍历
    public void frontShow() {
        rootNode.frontShow();
    }

    //中序遍历
    public void midShow() {
        rootNode.midShow();
    }

    //后序遍历
    public void aftShow() {
        rootNode.aftShow();
    }
	public void delete(int i) {

        if(rootNode.getData()==i){
            //如果删除的是根节点,则让根节点的指向为空
            rootNode=null;

        }else {
            //删除的不是根节点
            rootNode.delete(i);
        }
    }
}

TreeNode类

package com.wuxudong.BinaryTree;

//树的节点
public class TreeNode {

    private int data;

    public TreeNode(int data){
        this.data=data;
    }

    //左右节点
    private TreeNode leftNode;

    private TreeNode righNode;

    public void setData(int data) {
        this.data = data;
    }

    public void setLeftNode(TreeNode leftNode) {
        this.leftNode = leftNode;
    }

    public void setRighNode(TreeNode righNode) {
        this.righNode = righNode;
    }

    public int getData() {
        return data;
    }

    public TreeNode getLeftNode() {
        return leftNode;
    }

    public TreeNode getRighNode() {
        return righNode;
    }


    //前序遍历,先遍历当前的内容,然后左节点,右节点
    public void frontShow() {
        System.out.println(data);
        if(leftNode!=null) {
            leftNode.frontShow();
        }
        if(righNode!=null){
            righNode.frontShow();
        }

    }

    //中序遍历,先遍历左节点,然后根节点,最后右节点
    public void midShow() {
        if(leftNode!=null){
            leftNode.midShow();
        }
        System.out.println(data);
        if (righNode!=null){
            righNode.midShow();
        }

    }

    //后序遍历,先遍历左节点,然后右节点,最后根节点
    public void aftShow() {
        if(leftNode!=null){
            leftNode.aftShow();
        }
        if(righNode!=null){
            righNode.aftShow();
        }
        System.out.println(data);
    }
public void delete(int i) {
        //获取当前的根节点
        TreeNode treeNode=this;

        //删除左节点
        if(treeNode.leftNode!=null&&treeNode.leftNode.getData()==i){
            treeNode.leftNode=null;
            return;
        }



        //删除右节点
        if (treeNode.righNode!=null&&treeNode.righNode.getData()==i){
            treeNode.righNode=null;
            return;
        }

        //如果不是左节点,则递归删除左子树
        //这里的leftNode不能写成treeNode.leftNode因为里面的方法递归完之后treeNode就变了
        treeNode=leftNode;
        if (treeNode!=null) {
            treeNode.delete(i);
        }


        //如果不是右节点,递归删除右子树
        treeNode=righNode;
        if (treeNode!=null){
                treeNode.delete(i);
        }


    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值