数据结构之二叉树

本文深入探讨了二叉树的结构特性,包括度、节点类型、遍历方式等核心概念,同时展示了如何创建、遍历以及操作二叉树实例。详细介绍了二叉树的层次遍历、叶子节点计数、双分支节点计数和度计算等实用技巧,旨在为读者提供全面的二叉树知识体系。

一种非线性结构
<1>有且只有一个节点无前驱—根节点
<2>有多个节点没有后继—叶子节点
<3>除根,叶子节点外的其余节点,向上只有一个前驱,向下有多个后继

节点的度:一个节点的子女节点的个数
树的度:树中度值最大的节点的度
K叉树,即树的度值为K

本文主要以二叉树为主:
<1>一棵非空二叉树的叶子节点总比双分支节点多一个
即,总节点个数=双分支节点数+单分支节点数+叶子节点数
=2倍的双分支节点数+单分支节点数+1
<2>对二叉树按层编号 0,1,2,3…..
第i层,最多有2^(i-1)
满二叉树:每一层都有 2^(i-1)个节点
<3> 一棵h层的满二叉树的节点个数为2^(h-1)
<4>完全二叉树:一棵h层的完全二叉树,前h-1层是满的,最后一层连续 缺失右边的节点,满二叉树是一个特殊的完全二叉树,并完全二叉树的节点区间2^(h-1) -1

typedef struct node{
    int data;
    struct node *left;
    struct node *right;
}BTNode;

创建一棵二叉树:

BTNode *CreateBTree(int D[],int n)
{
    BTNode *root,*q,*p,*c;
    int i;
    root=(BTNode *)malloc(sizeof(BTNode));
    root->data=D[0];
    root->left=root->right=NULL;
    for( i=1;i<n;++i)
    {
        p=(BTNode *)malloc(sizeof(BTNode));
        p->data=D[i];
        p->left=p->right=NULL;
        c=root;
        while(c)
        {
            q=c;
            if(p->data<c->data)
                c=c->left;
            else
                c=c->right;
        }
        if(p->data>q->data)
            q->right=p;
        else
            q->left=p;
    }
    return root;
}

对二叉树进行遍历:
前序遍历:

void Fnorder(BTNode *root)
{
    if(root)
    {
       printf("%3d",root->data);
       Fnorder(root->left);
       Fnorder(root->right);
    }
}

中序遍历:

void Inorder(BTNode *root)
{
    if(root)
    {
       Inorder(root->left);
       printf("%3d",root->data);
       Inorder(root->right);
    }
}

后序遍历:

void Forder(BTNode *root)
{
    if(root)
    {
       Forder(root->left);
       Forder(root->right);
       printf("%3d",root->data);
    }
}

按层遍历:

int print_level(BTnode *root,int level){
    if(!root||level<0){
        return 0;
    }
    if(0==level){
        printf("%d,",root->value);
        return 1;
    }
    return print_level(root->left,level-1)+print_level(root->right,level-1);
}

二叉树的叶子节点:

int countleafnode(BTNode *root)
{
    if(!root) return 0;
    else return countleafnode(
    root- >left)+countleafnode(root->right)
    +(!root->left&&!root->right);
}

二叉树的双分支节点:

int countdounode(BTNode *root)
{   if(!root) return 0;
    else return countdounode(root->left)+countdounode(root->right)+(root->left&&root->right);

}

二叉树的度:

int CountDu(BTnode *root){
    if(!root) return 0;
    int left=CountDu(root->left);
    int right=CountDu(root->right);
    return left>right?left+1:right+1;

}

生成一个镜像二叉树:

void CreateBTreeN(BTNode *root){
    BTNode *t;
    if(root){
        t=root->left;
        root->left=root->right;
        root->right=t;
        CreateBTreeN(root->left);
        CreateBTreeN(root->right);   
    }   
}

判断是否为平衡二叉树:

bool Isblance(BTnode *root,int *depth){
    if(root==NULL){
        *depth=0;
        return true;
    }
    int left,right;
    if(Isblance(root->left,&left)&&Isblance(root->right,&right)){
        int diff=left-right;
        if(diff<1&&diff>=-1){
            *depth=1+(left>right?left:right);
            return true;
        }
    }
    return false;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值