Java-数据结构:树

本文介绍了树的基本概念和术语,重点讲解了二叉树的定义、特性,包括满二叉树和完全二叉树。此外,还讨论了二叉树的存储结构,如顺序存储和链式存储,并探讨了二叉树的遍历方法,如先序、中序、后序和层次遍历,以及如何根据遍历序列重建二叉树。
摘要由CSDN通过智能技术生成

目录:

一、树
1. 概述
2. 一些基本术语
二、二叉树
1. 概述
2. 重要特性
三、二叉树的存储结构
1. 顺序存储
2. 链式存储
四、二叉树的遍历
1. 由遍历序列确定二叉树
2. 根据遍历序列估计二叉树
3. 遍历和建树代码


一、树

1. 概述

  • 与线性表表示的一一对应的线性关系不同,树表示的是更为复杂的数据元素之间的非线性关系
  • 直观来看,树是以分支关系定义的层次结构,是 一对多 的关系
  • 树的定义:树 (Tree) 是 n( n>=0 ) 个结点的有限集合
  • 有且仅有一个 根结点 (Root)
  • 当n>1的时,其余结点可分为 m( m>0 ) 个互不相交的有限集T1,T2,…, Tm,其中每一个集合本身又是一棵树,并且称之为根的子树

树的定义本身是一个递归定义,即在树的定义中又用到树的概念

2. 一些基本术语

  • 树的结点:包含一个数据元素和若干指向其子树的分支
  • (degree):结点拥有的子树的数目
  • 度为** 0 的结点称为 叶子**,或** 终端结点**。度不为** 0** 的结点称为 非终端结点 或 分支节点
  • 结点的子树的根,称为该结点的 孩子(child),相应的该结点称为孩子的 双亲(parent)
  • 同一个双亲的孩子之间互称兄弟(sibling)
  • 结点的 祖先 是从根到该结点所经分支上所有的结点。
  • 以某结点为根的子树中的任意一结点都称为该结点的 子孙
  • 结点的 层次(Level)从根开始定义,根为第一层,根的孩子为第二层,以此类推
  • 树中结点的最大层次称为树的 深度(depth)或 高度

二、二叉树

1. 概述

  • 定义:对一般的树加了约束:

  • 每个结点最多两棵子树,即二叉树中不存在 度大于2 的结点

  • 子树有 左右次序 之分

  • 有 5 种形态

二叉树的形态

  • 满二叉树完全二叉树(对满二叉树最底层,从右至左删除结点)

2. 重要特性

  • 二叉树,在第 i 层至多有 2i-1 个结点
  • 深度为 k 的二叉树至多有 2k-1 个结点
  • 高度(或深度)为 K 的完全二叉树至少有 2k-2 个 叶子结点
  • 非空二叉树的 叶子结点数 等于度为 2 的结点数加 1,即:n0 = n2 + 1

完全二叉树的 n1 只能是 0 或者 1

  • 一颗度为 m 的二叉树,度为 1 的结点为 n1,度为 2 的结点为 n2,… …,度为 m 的结点数为 nm,则叶子结点数:n0**= 1 + n2****+ 2n3****+…+ (m-1)nm**
  • 具有 n 个结点的完全二叉树,深度为 log2n + 1
  • 编号性质:n 个结点的完全二叉树(其深度为 log2n + 1),对各结点从上到下,从左到右依次编号(1~n)则:若 i 是某结点 a 的编号:
  • 如果 i 不等于 1,则 a 的双亲结点的编号为: ⌊ i/2 ⌋
  • 如果 2i ≤ n, 则 a 的左孩子编号为 2i;如果** 2i > n**, 则 a** 无左孩子**;
  • 如果** 2i + 1 ≤ n**, 则 a 的右孩子编号为** 2i + 1**;如果** 2i + 1> n**, 则 a** 无右孩子**;

三、二叉树的存储结构

1. 顺序存储

  • 用 数组 来存储数据元素
  • 从存储的角度来看,这种顺序存储结构,仅适用于 完全二叉树

因为在最坏的情况下,一个深度为 k 且只有 k 个结点的单支树( 树中不存在度为 2 的结点 ),却需要长度为 2k-1 的一维数组。

2. 链式存储

  • 以 链表 的形式,存储数据元素以及数据元素之间的关系。

链式存储


四、二叉树的遍历

1. 由遍历序列确定二叉树

  • 由 先序和中序,可以确定
  • 由 后序和中序,可以确定(但是注意后序最后一个为根下一个是右子树根
  • 由 层次和中序,可以确定

2. 根据遍历序列估计二叉树

  • 前序 遍历序列 和 后序 遍历序列 相同 的树:只有根结点
  • 前序 遍历 和 中序 遍历 相同 的二叉树:所有结点没有左子树(右单分支树
  • 中序 遍历 和 后序 遍历 相同 的二叉树:所有结点没有右子树(左单分支树)
  • 前序遍历 和 后序 遍历 相反 的二叉树:没有左子树或者没有右子树(只有一个叶子结点高度等于其结点数
  • 前序 遍历 和 中序 遍历 相反 的二叉树:所有结点没有右子树(左单分支树)
  • 中序 遍历 和 后序 遍历 相反 的二叉树:所有结点没有左子树(右单分支树)

3. 遍历和建树代码

  • 二叉树的建树
  • 深度优先遍历(先序,中序和后序)
  • 广度优先遍历(先序,后序)
/* BitTree.java */

package com.java.tree;

import java.util.LinkedList;
import java.util.Queue;

/**
 * Created by Jaco.Young.
 * 2018-06-13 18:26
 */
public class BitTree {
   

    //代表由先序和中序唯一确定的树的根结点
    private TreeNode root;

    /**
     * 提供给外部调用的方法
     * 字符数组pre表示先序遍历序列,mid表示中序遍历序列
     */
    public void build(char[] pre, char[] mid){
   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值