【数据结构】二叉树基本内容整理(一)

一、二叉树的定义:度数(每个节点所有的子树的最大值)为2的数。

二、二叉树的性质:

1.在二叉树的第 i 层上最多有 2 ^ (i - 1) 个结点;

2.深度为 k 的二叉树最多有 2 ^ k - 1 个结点;

  2-1.一棵深度为 k 且有 2 ^ k - 1 个结点的二叉树被称为满二叉树

  2-2.将满二叉树的每一个结点从上而下,从左到右编上序号(1~2 ^ k - 1)。一棵深度为 k ,有 n 个结点的二叉树当且仅当其每一个结点都与深度为 k 的满二叉树一一对应时(即只有最后倒数第二层有度数不为2的结点,只有最后一层结点相对于满二叉树有缺失,且最后一层缺失的结点是从最右到左连续的),这棵树被称为完全二叉树

3.对于任意一棵二叉树,其叶结点数一定比度为2的结点数多1。即:n0 = n2 + 1

4.具有 n 个结点的完全二叉树的深度为 floor(log2 n) + 1(floor指向下取整);

5.对于一棵 n 个结点的完全二叉树,对任意一个结点(编号为 i ),有:

  5-1.如果 i = 1,那么此结点为根结点,否则其父结点编号为 floor(i / 2)(在程序中可直接写为 i / 2);

  5-2.如果 2*i > n,则此结点没有孩子,是根结点;如果 2*i == n,则此结点只有左孩子,其编号为 2*i ;否则此节点有左孩子和右孩子,编号分别为 2*i 和 2*i + 1。

三、二叉树的存储:链式存储结构:

1 struct node
2 {
3      DATA_TYPE data;//数据
4      node* leftChild,rightChild;//左孩子和右孩子
5 };
6 node* bt;//根结点

四:二叉树的遍历(每种遍历在二叉树为空时不进行操作)

1.先序遍历:(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树(根->左->右)

2.中序遍历:(1)中序遍历左子树;(2)访问根结点;(3)先序遍历右子树(左->根->右)

3.后序遍历:(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点(左->右->根)

void pre(node* bt)//先序遍历
{
    if(bt)
    {
        cout<<bt->data;
        pre(bt->leftChild);
        pre(bt->rightChild);
    }
}
void in(node* bt)//中序遍历
{
    if(bt)
    {
        in(bt->leftChild);
        cout<<bt->data;
        in(bt->rightChild);
    }
}
void post(node* bt)//后序遍历
{
    if(bt)
    {
        post(bt->leftChild);
        post(bt->rightChild);
        cout<<bt->data;
    }
}
原文地址:https://www.cnblogs.com/jiangyuechen/p/12622488.html