数据结构——二叉树(1)

184 阅读3分钟

树的简介

树:一种非线性的数据结构,逻辑上是由n个结点组成的一个具有层次关系的集合. image.png

树的定义

树是递归定义的:

任何一棵非空树,都可以划分为根和子树,例: image.png 但子树也可以继续划分为根和子树

image.png

直到最后的子树只能划分出根和空树。

树的相关概念

image.png

父结点与子结点/孩子结点

以上树为例,A结点是B结点的父结点,

B结点是A结点的子结点/孩子结点.

兄弟结点:具有相同父结点的结点互称为兄弟结点;

堂兄弟结点:父结点在同一层的结点互称为堂兄弟结点;

结点的度:一个结点中含有子结点的个数(或子树的个数);

如A结点的度为3, B结点的度为2,E结点的度为0.

树的度:一棵树中,哪个结点的度最大,树的度就是那个结点的度

叶结点/终端结点:度为0的结点;

分支结点/非终端结点:度不为0的结点;

结点的层次:一般从根开始,根为第一层,根的子结点在第二层,以此类推;

树的高度:树中结点的最大层次;

祖先结点:从该结点到根结点路径上的所有结点都是该结点的祖先结点。

子孙结点:以该结点为根的子树,树中任一结点都为该结点的子孙.

自己是不是自己的祖先?看题目的认定。

树的特征

1 子树是不相交的;

2 除了根结点,其它结点有且只有一个父结点;

3 一棵N个结点的树,有(N-1)条边。

image.png

树的表示

树的一个结点既要保存自己的数据,也要能表示出与其它结点的关系。

或者说表示出所有的子结点。

struct TreeNode
{
    int data;
    struct TreeNode* child1;
    struct TreeNode* child2;
    …………………………………………
}//难以在结构体中声明所有的孩子结点

以上方案无法表示出该结点的所有子结点,除非已经知道树的度。

有一种有效的方法叫孩子兄弟表示法.

struct TreeNode
{
    struct TreeNode* leftchild;//左边第一个孩子结点
    struct TreeNode* rightbrother;//指向下一个兄弟结点
    int data;
}

一个父亲可能有多个孩子,孩子多了照顾不过来,

于是这个父亲决定只管老大,老大管老二,老二管老三.

无论有多少个孩子结点,当前结点只管第一个孩子结点,

剩下的孩子结点由孩子的兄弟指针来表示.

image.png

二叉树简介

若一棵树中,每个结点的度最多是2,这棵树就是二叉树. image.png

特殊二叉树

满二叉树

一棵二叉树,若每一层的结点数都达到max,它就是满二叉树.

image.png

性质1:第K层的结点数是2^(K-1)

性质2:若一棵满二叉树的高度为K,则它的结点数N为 2^K - 1

N = 2^0+2^1+2^2+……+2^(K-1) = 2^K - 1.

知道满二叉树的结点数也能推出它的高度K。

K = log(N+1).

完全二叉树

一棵二叉树的高度为K,若前(K-1)层的结点数是满的,

第K层结点数不一定满,但一定是从左到右连续的,

这棵树就是完全二叉树.

image.png

性质1:度为1的结点只有0个或1个

性质2:设高度为K,则结点数的范围是:

前K-1层是满的,第K层只有1个结点 ~ K层全满.

[2^(K-1), 2^K-1]

二叉树的普遍性质

若规定根结点的所在层数是1:

A 一棵二叉树的第k层上最多有2^(k-1)个结点

B 深度为K的二叉树最大结点数为2^K - 1

C 对任何一棵非空二叉树,度为0的结点数总是比度为2的结点数多一个

即 n0 = n2 + 1;