数据结构之初识二叉树

树结构

树是由一个集合以及在该集合上定义的一种关系构成的。

集合中的元素称为树的结点,所定义的关系称为父子关系。

父子关系在树的结点之间建立了一个层次结构。

在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。

没有子结点的结点称为叶子结点。

(1)结点的层次和树的高度(深度)

结点的层次(level)从根开始定义,层次数为0的结点是根节点,其子树的根的层次为1.。。。。。。

数中的结点的最大层次数称为数的深度(Depth)或者高度,数中结点也有高度,其高度是以该结点为根的树的高度。

(2)结点的度与树的度

结点拥有的子树的数目称为结点的度(Drgree)

度为0的结点称为叶子(leaf)结点。度不为0的结点称为非终端结点或者分支结点。除根之外的分支结点也称为内部结点。

性质:树中的结点数等于树的边数加1,也等于所有结点的度数之和加1

(3)路径

在树中k+1个结点通过k条边连接构成的序列,称为长度为k的路径。

树中任意两个结点之间都存在唯一的路径。这意味着树既是连通的,同时他又不会出现环路。从根结点开始,存在到其他任意结点的一条唯一路径,根到某个结点路径的长度,恰好是该结点的层次数。

(4)m叉树、森林

树中所有结点最大度数为m的有序树称为m叉树。

二叉树:

​ 每个结点最多只能有两个子结点的一种树形式。

​ 二叉树的子节点分为左节点和右节点。

​ 如果该二叉树的所有叶子节点都在最后一层,并且结点总数=2^n-1,n为层数,则我们称为满二叉树。

​ 如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。

在这里插入图片描述

森林(forset)是m(m>=0)棵互不相交的树的集合。对树中的每个结点而言。其子树的集合即为森林。树和森林的概念相近,删去一棵树的根,就得到一个森林,反之,加上一个结点作树根,森林就变成一棵树。

二叉树的遍历

​ 前序遍历:先输出父结点,再遍历左子树和右子树;

​ 中序遍历:先遍历左子树,再输出父节点,再遍历右子树;

​ 后序遍历:先遍历左子树,再遍历右子树,最后再输出父节点。

思路:

​ 1.创建一棵二叉树。

​ 2.前序遍历

​ (1)先输出当前节点,

​ (2)如果左子结点不为空,则继续递归前序遍历

​ (3)如果右子节点不为空,则继续递归前序遍历

​ 3.中序遍历

​ (1)如果当前节点的左子节点不为空,则递归中序遍历

​ (2)输出当前节点(初始的时候是root节点)

​ (3)如果当前节点的右子结点不为空,则递归中序遍历

​ 4.后序遍历

​ (1)如果当前节点的左子节点不为空,则递归后序遍历

​ (2)如果当前节点的右子结点不为空,则递归后序遍历

​ (2)输出当前节点(初始的时候是root节点)

 /**
     * 前序遍历
     */
    public void preOrder() {
    
    
        //先输出父节点
        System.out.println(this);
        //递归向左子树前序遍历
        if (this.left != null) {
    
    
            this.left.preOrder();
        }
        //递归向右节点前序遍历
        if (this.right != null) {
    
    
            this.right.preOrder();
        }
    }
    /**
     * 中序遍历
     */
    public void infixOrder() {
    
    
        //递归向左子树中序遍历
        if (this.left != null) {
    
    
            this.left.preOrder();
        }
        //输出父节点
        System.out.println(this);
        //递归向右子树中序遍历
        if (this.right != null) {
    
    
            this.right.infixOrder();
        }
    }
    /**
     * 后序遍历
     */
    public void postOrder() {
    
    
        if (this.left != null) {
    
    
            this.left.preOrder();
        }
        if (this.right != null) {
    
    
            this.right.postOrder();
        }
        System.out.println(this);
    }

猜你喜欢

转载自blog.csdn.net/z318913/article/details/120601709