二叉树数据结构
元素最多具有2个子代的树称为二叉树。由于二叉树中的每个元素只能有2个子代,因此我们通常将它们命名为左子代和右子代。

二叉树节点包含以下部分。
- 数据
- 指向左孩子的指针
- 指向正确的孩子的指针
二叉树包括:
- 满二叉树(Full Binary Tree)
- 完整的二叉树(Complete Binary Tree)
- 完美二叉树(Perfect Binary Tree )
- 平衡二叉树 (Balanced Binary Tree )
- 退化或病态树 A degenerate (or pathological) tree
满二叉树(Full Binary Tree):
如果每个节点都有0或2个子节点,则二叉树就是完整的二叉树。以下是完整的二叉树的示例。我们也可以说完整的二叉树是一个二叉树,其中除叶节点外的所有节点都有两个孩子。
18
/ \
15 30
/ \ / \
40 50 100 40
18
/ \
15 20
/ \
40 50
/ \
30 50
18
/ \
40 30
/ \
100 40
完整的二叉树(Complete Binary Tree):
如果所有级别都已完全填充(最后一个级别除外),并且最后一个级别的所有键都尽可能保留,则二叉树就是完整的二叉树
18
/ \
15 30
/ \ / \
40 50 100 40
18
/ \
15 30
/ \ / \
40 50 100 40
/ \ /
8 7 9
完美二叉树(Perfect Binary Tree ):
一个完美的二叉树,其中所有内部节点都有两个子节点,所有叶节点都处于同一级别。
-
在完美二叉树中,叶节点数是内部节点数加1
-
L = I + 1其中L =叶子节点数,I =内部节点数。
-
高度为h的完美二叉树(其中二叉树的高度是从根节点到树中任何叶节点的最长路径)具有2 h + 1 – 1个节点。
-
完美二叉树的一个例子是家族中的祖先。固守一个人的根基,父母作为孩子,父母的父母作为孩子
18
/ \
15 30
/ \ / \
40 50 100 40
18
/ \
15 30
平衡二叉树 (Balanced Binary Tree ):
如果二叉树的高度为O(Log n),则二叉树是平衡的,其中n是节点数。例如,AVL树通过确保左右子树的高度差不超过1来保持O(Log n)的高度。红黑树通过确保树的数量保持O(Log n)的高度。到叶路径的每个根上的黑色节点是相同的,并且没有相邻的红色节点。平衡的二进制搜索树在性能方面很不错,因为它们为搜索,插入和删除提供了O(log n)时间。
退化或病态树 A degenerate (or pathological) tree :
其中每个内部节点都有一个子代。这样的树在性能上与链表相同。
10
/
20
\
30
\
40
C语言中的二叉树表示:一棵树由指向树中最高节点的指针表示。如果树为空,则root的值为NULL。
节点的指针在C语言中,我们可以使用结构表示树节点。以下是具有整数数据的树节点的示例。
/* Class containing left and right child
of current node and key value*/
class Node
{
int key;
Node left, right;
public Node(int item)
{
key = item;
left = right = null;
}
}
让我们创建一个在C中具有4个节点的简单树。创建的树如下
tree
----
1 <-- root
/ \
2 3
/
4
用C语言示范:
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* left;
struct node* right;
};
/* newNode() allocates a new node
with the given data and NULL left
and right pointers. */
struct node* newNode(int data)
{
// Allocate memory for new node
struct node* node
= (struct node*)malloc(sizeof(struct node));
// Assign data to this node
node->data = data;
// Initialize left and
// right children as NULL
node->left = NULL;
node->right = NULL;
return (node);
}
int main()
{
/*create root*/
struct node* root = newNode(1);
/* following is the tree after above statement
1
/ \
NULL NULL
*/
root->left = newNode(2);
root->right = newNode(3);
/* 2 and 3 become left and right children of 1
1
/ \
2 3
/ \ / \
NULL NULL NULL NULL
*/
root->left->left = newNode(4);
/* 4 becomes left child of 2
1
/ \
2 3
/ \ / \
4 NULL NULL NULL
/ \
NULL NULL
*/
getchar();
return 0;
}
树是分层数据结构。树的主要用途包括维护分层数据,提供适度的访问权限以及插入/删除操作。二叉树是树的特殊情况,其中每个节点最多有两个孩子。
本文介绍了二叉树数据结构的各个类型,包括满二叉树、完整的二叉树、完美二叉树、平衡二叉树和退化的二叉树。详细阐述了各种类型的特点,如满二叉树的每个节点要么有两个子节点,要么没有子节点;完整的二叉树在除了最后一层外,所有层都被完全填满;完美二叉树中所有内部节点都有两个子节点,所有叶节点在同一层级;平衡二叉树保证了O(log n)的操作效率;退化的二叉树形如链表。

1149

被折叠的 条评论
为什么被折叠?



