数据结构与C++

数据结构与C++ 知识量:9 - 32 - 91

6.2 二叉树><

二叉树的定义- 6.2.1 -

二叉树(Binary Tree)是一种特殊的树形结构,每个节点最多只有两个子节点,通常称为左子节点和右子节点。二叉树具有以下特点:

  • 每个节点最多只能有两棵子树,且有左右之分。

  • 二叉树是有序树,即左子树和右子树的顺序是重要的。

  • 二叉树的存储结构及其算法都较为简单,因此在实际应用中经常使用。

根据不同的情况,二叉树可以按照不同的方式进行分类:

  • 满二叉树:如果二叉树中所有分支节点都存在左子树和右子树,并且所有叶子节点在同一层,这样的二叉树称为满二叉树。

  • 完全二叉树:对于具有n个节点的二叉树,如果按层序编号,每个节点与深度为k的满二叉树中编号为i的节点在二叉树中的位置完全相同,这样的二叉树称为完全二叉树。完全二叉树的特点是叶子节点只可能出现在层序最大的两层上,并且某个节点的左分支下子孙的最大层序与右分支下子孙的最大层序相等或大1。

  • 线索二叉树:按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有节点排列为一个线性序列。在该序列中,除第一个节点外,每个节点有且仅有一个直接前驱节点;除最后一个节点外,每个节点有且仅有一个直接后继节点。这种二叉树称为线索二叉树。

此外,还有平衡二叉树、红黑树等不同类型的二叉树。平衡二叉树是一种特殊的二叉搜索树,它要求每个节点的左子树和右子树的高度差不超过1。红黑树则是一种自平衡的二叉查找树,它满足一系列的红黑性质。

在计算机科学中,二叉树广泛应用于各种问题,如文件系统、哈希表、堆排序等。通过对二叉树的遍历,可以对树形结构进行搜索、插入、删除等操作,从而解决各种实际问题。

二叉树的性质- 6.2.2 -

二叉树是一种特殊的树形结构,每个节点最多只有两个子节点,通常称为左子节点和右子节点。以下是二叉树的一些重要性质:

  1. 二叉树的第i层上至多有2i-1(i≥1)个节点。

  2. 深度为h的二叉树中至多含有2h-1个节点。

  3. 具有n个节点的满二叉树深为log2n+1。

  4. 若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),对于编号为i(i≥1)的节点:当i=1时,该节点为根,它无双亲节点;当i>1时,该节点的双亲节点的编号为i/2,2i≤n,则有编号为2i的左节点,否则没有左节点。

  5. 二叉树的子树不能相交。

  6. 除了根节点外,每个结点有且仅有一个父节点。

  7. 一颗N个结点的树有N-1条边。

  8. 一个结点的子树的个数叫结点的度。

  9. 在完全二叉树的情况下可以得到最多的叶子结点,叶子结点最多的个数与节点总数的奇偶数有关,奇数有(n-1)/2+1个,偶数个有n/2个。

  10. 若规定根节点的层数为1,则一颗非空二叉树的第i层上最多有2的(i-1)次方个结点,其中i>0。

  11. 若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2^k - 1(k>=0)。

  12. 对任何一颗二叉树,如果其叶结点个数为n0,度为2的非叶结点个数为n2,则有n0=n2+1。

二叉树的存储结构- 6.2.3 -

二叉树的存储结构可以分为顺序存储结构和链式存储结构两种。

  • 顺序存储结构是指使用一组地址连续的存储单元依次存储二叉树中的节点。对于完全二叉树,可以采用顺序存储结构,即将节点按照从上到下、从左到右的顺序存储在一维数组中,节点的位置与其在树中的位置相对应。这种情况下,可以通过数组元素的下标值来确定节点在二叉树中的位置以及节点之间的关系。然而,对于一般的二叉树,顺序存储结构可能会造成存储空间的浪费,因为很多节点的左子节点和右子节点可能并不连续存储。

  • 链式存储结构则是通过指针域来存储二叉树中节点之间的关系。每个节点包含数据元素和左右子节点的指针,其中左指针指向左子节点,右指针指向右子节点。链式存储结构可以更加灵活地表示任意形状的二叉树,但需要额外的指针域来存储指针信息。

在实际应用中,可以根据具体的需求和场景选择适合的存储结构。对于需要频繁进行插入、删除等操作的二叉树,链式存储结构更加合适;而对于需要高效进行遍历和查找等操作的二叉树,顺序存储结构可能更加合适。

以下是使用C++语言描述二叉树存储结构的示例代码:

#include <iostream>  
using namespace std;  
  
// 定义二叉树节点结构体  
struct TreeNode {  
    int val;  
    TreeNode* left;  
    TreeNode* right;  
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}  
};  
  
// 顺序存储结构示例  
// 一维数组存储完全二叉树节点  
int array[10]; // 假设有10个节点  
  
// 链式存储结构示例  
// 创建节点并构建二叉树  
TreeNode* root = new TreeNode(1);  
root->left = new TreeNode(2);  
root->right = new TreeNode(3);  
root->left->left = new TreeNode(4);  
root->left->right = new TreeNode(5);  
root->right->left = new TreeNode(6);  
root->right->right = new TreeNode(7);

在这个示例中,使用了结构体 TreeNode 来表示二叉树的节点,包含数据元素 val 和左右子节点的指针 left、right。顺序存储结构示例使用一维数组来存储完全二叉树的节点,而链式存储结构示例则通过创建节点对象并设置指针域来构建二叉树。