二叉树

首先我们先介绍一下与树相关的三个概念:高度,深度,层级。他们的定义是这样的:

   

节点的高度=节点到叶子节点的最长路径(即最大边数) 

节点的深度=根节点到该节点所经过的最大边数

节点的层级=节点的深度+1

树的高度=根节点的高度

在理解记忆方面,我们高度可以比作为楼房的高度,只是从0开始的,深度可以理解为水的深度,以水平面为参照物,层级跟深度有一样的类比,只是他们的开始值不一样,深度是从0开始的,而层级是从1开始的。

接下来我们来讨论二叉树

   二叉树中有俩种特殊的二叉树,分别为如图 2的满二叉树,如图3的完全二叉树。


  


想要存储一棵二叉树,我们有两种方法,一种是基于指针或者引用的链式存储法,一种是基于数组的顺序存储。基于链表的链式存储结构如下:

     

基于线性结构顺序存储的数据如下:

对于完全二叉树适合用顺序数组存储这样的方式进行存储,对于非完全二叉树使用这种存储方式,太浪费空间。在我们的jvm中,堆就是一个完全二叉树,最常用的存储方式就是数组。

二叉树的遍历:

二叉树的遍历分为:前序遍历,中序遍历跟后序遍历。其中,前,中,后序表示的是结点与它的左右子树节点遍历打印的先后顺序。

前序遍历是指,对于树中的任意节点来说,先打印他本身,再打印它的左子树,最后打印右子树。

中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后打印它本身,最后打印它的右子树。

后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后打印它的右子树,最后打印它本身。

所谓的前,中,后其实都是以节点本身来说的,前序遍历,就是先打印它本身;中序遍历就是先左,然后就是它本身;后序遍历就是先左子树,再右子树,最后它本身。

实际上二叉树的前,中,后序遍历是一个递归的过程。写递归代码的关键,就是看能不能写出递归公式,而写出递归公式的关键就是,如果要解决问题A,就假设子问题B、C已经解决了,然后再来看如何利用B、C来解决A。所以我们可以把前,中,后遍历的递归公式先写出来。

preorder(r)=print(r)->preorder(r->left)->preorder(r->right)

inorder(r)=inorder(r->left)->inorder(r)->inorder(r->right)

postorder(r)=postorder(r->left)->postorder(r->right)->postorder(r)

代码实现如下:

public class BinarryTree<T> {
    BinarryTree<T> left;
    BinarryTree<T> right;
    T data;

    public BinarryTree(BinarryTree<T> left, BinarryTree<T> right, T data) {
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public BinarryTree() {
    }

    public BinarryTree<T> getLeft() {
        return left;
    }

    public void setLeft(BinarryTree<T> left) {
        this.left = left;
    }

    public BinarryTree<T> getRight() {
        return right;
    }

    public void setRight(BinarryTree<T> right) {
        this.right = right;
    }

    public T getData() {
        return data;
    }

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

    //二叉树的前序比遍历
    public  void preOrder(BinarryTree root){
        if (root !=null){
            System.out.println(root.getData());
            preOrder(root.getLeft());
            preOrder(root.getRight());
        }
    }

    //二叉树的中序遍历
    public void inOrder(BinarryTree root){
        if(root != null){
            inOrder(root.getLeft());
            System.out.println(root.getData());
            inOrder(root.getRight());
        }
    }

    //二叉树的后序遍历
    public  void postOrder(BinarryTree root){
        if(root != null){
            postOrder(root.getLeft());
            postOrder(root.getRight());
            System.out.println(root.getData());
        }
    }
}

 

   

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值