二叉树数据结构

本文介绍了二叉树数据结构的各个类型,包括满二叉树、完整的二叉树、完美二叉树、平衡二叉树和退化的二叉树。详细阐述了各种类型的特点,如满二叉树的每个节点要么有两个子节点,要么没有子节点;完整的二叉树在除了最后一层外,所有层都被完全填满;完美二叉树中所有内部节点都有两个子节点,所有叶节点在同一层级;平衡二叉树保证了O(log n)的操作效率;退化的二叉树形如链表。

二叉树数据结构

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

在这里插入图片描述
二叉树节点包含以下部分。

  • 数据
  • 指向左孩子的指针
  • 指向正确的孩子的指针

二叉树包括:

  1. 满二叉树(Full Binary Tree)
  2. 完整的二叉树(Complete Binary Tree)
  3. 完美二叉树(Perfect Binary Tree )
  4. 平衡二叉树 (Balanced Binary Tree )
  5. 退化或病态树 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;
}

树是分层数据结构。树的主要用途包括维护分层数据,提供适度的访问权限以及插入/删除操作。二叉树是树的特殊情况,其中每个节点最多有两个孩子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值