数据结构---二叉树

本文介绍了二叉树的概念,包括树的深度、节点度、叶子节点等,强调了二叉树的定义及特性,如满二叉树和完全二叉树的定义。接着详细阐述了链式存储实现二叉树的方法,并提供了前序、中序、后序遍历的递归代码实现。
摘要由CSDN通过智能技术生成

数据结构之二叉树:

  • 树的最大层次称为树的深度

  • 节点拥有的子树数量称为节点的度

  • 度为0的节点都称为叶子节点

  • 二叉树的定义: 每个节点至多只有两棵子树,(即二叉树中不存在大于度大于2的节点,并且二叉树的子树有左右之分)

  • 二叉树的第i 层至多有 2^(i-1)个节点

  • 深度为k 的二叉树至多有 2^k -1个节点

  • 满二叉树: 一颗深度为 k 且 有 2^k -1个节点的二叉树称为满二叉树(完全对称) 除了叶子节点,其他每个节点都要两个子节点

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

  • 完全二叉树就是满二叉树从右到左依次删除节点

二叉树的五种基本形态特殊的二叉树:
在这里插入图片描述链式存储实现二叉树:

定义树节点:

public class TreeNode {
    //节点的权
    int value;
    //左儿子
    TreeNode leftNode;
    //右儿子
    TreeNode rightNode;

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

    public void setRightNode(TreeNode rightNode) {
        this.rightNode = rightNode;
    }
}

定义一颗二叉树:

public class BinaryTree {
    TreeNode treeNode;

    public TreeNode getTreeNode() {
        return treeNode;
    }

    public void setTreeNode(TreeNode treeNode) {
        this.treeNode = treeNode;
    }
 }

创建测试类:
创建二叉树:

public class BinaryTreeTest {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree(); //创建一个空树
        TreeNode root = new TreeNode(1);  //创建一个根节点,权值为1
        binaryTree.setTreeNode(root);           //设置数的根节点
        TreeNode lNode1 = new TreeNode(2); //创建一个左节点
        TreeNode rNode1 = new TreeNode(3); //创建一个右节点
        root.setLeftNode(lNode1);   //设置二叉树根节点的左节点
        root.setRightNode(rNode1); //设置二叉树根节点的右节点

        TreeNode lNode2 = new TreeNode(4);
        TreeNode rNode2 = new TreeNode(5);
        lNode1.setLeftNode(lNode2);
        lNode1.setRightNode(rNode2);
        rNode1.setLeftNode(new TreeNode(6));
        rNode1.setRightNode(new TreeNode(7));
        }
   }

遍历二叉树:
遍历二叉树的方式有三种:
1、前序遍历:
若二叉树不为空,则
(1)访问根节点
(2)前序遍历左子树
(3)前序遍历右子树

代码实现:
在节点类中:

/*
     * 前序遍历 先遍历根节点,再遍历左节点,再遍历右节点
     * 递归实现
     * 递归三部曲: 1、找递归终止条件 2、找返回值 3、希望本级递归做什么
     * */
    public void PreOrder(){
        //先遍历此节点的数据
        System.out.print(value+",");  //本级递归打印节点的数据  如果是要返回值 可以是 return value
        //遍历左节点
        if(leftNode != null){         //当左节点为空时,左边遍历终止
            leftNode.PreOrder();
        }
        //再遍历右节点
        if(rightNode != null){   // 当右节点为空时, 右边遍历终止
            rightNode.PreOrder();
        }
    }

在树类中实现:

/*
    * 前序遍历 先遍历根节点,再遍历左节点,再遍历右节点
    * */

    public void PreOrderTree(TreeNode node){
        System.out.print(node.value+",");
        if(node.leftNode != null){
            PreOrderTree(node.leftNode);
        }
        if(node.rightNode != null){
            PreOrderTree(node.rightNode);
        }
    }

2、中序遍历:
若二叉树不为空,则
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树

代码实现:
节点类中:

 /*
    * 中序遍历 先遍历左边节点 再遍历根节点 最后再遍历右节点
    * */

    public void InOrder(){
        if(leftNode != null){
            leftNode.InOrder();
        }
        System.out.print(value+",");
        if(rightNode != null){
            rightNode.InOrder();
        }
    }

在树类中:

 /*
    * 中序遍历
    * */
    public void InOrderTree(TreeNode node){
        if(node.leftNode != null){
            InOrderTree(node.leftNode);
        }
        System.out.print(node.value+",");
        if(node.rightNode != null){
            InOrderTree(node.rightNode);
        }
    }

3、后序遍历:
若树不为空,则
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点

代码实现:
节点类中:

/*
    * 后序遍历  先遍历左节点 再遍历右节点 再遍历根节点
    * */
    public void BeOrder(){
        if(leftNode != null){
            leftNode.BeOrder();
        }
        if(rightNode != null){
            rightNode.BeOrder();
        }
        System.out.print(value +",");
    }

树类中:

/*
    * 后序遍历 左 右 根
    * */
    public void BeOrderTree(TreeNode node){
        if(node.leftNode != null){
            BeOrderTree(node.leftNode);
        }
        if(node.rightNode != null){
            BeOrderTree(node.rightNode);
        }
        System.out.print(node.value+",");
    }

以上就是二叉树的递归遍历实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且-听风吟.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值