二叉树的一些操作

头文件

树.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#include<assert.h>
#include<math.h>

typedef char Datatype;

typedef struct BTNode{
    struct BTNode *pLeft;
    struct BTNode *pRight;
    Datatype data;
}BTNOde;

BTNOde*GreatTree(Datatype pre[], int size, int *pi)
{
    if (*pi >= size)
        return NULL;
    if (pre[*pi] == '#')
    {
        (*pi)++;
        return NULL;
        
    }
    BTNOde*pNode = (BTNOde*)malloc(sizeof(BTNOde));
    assert(pNode);
    pNode->data = pre[*pi];
    (*pi)++;
    pNode->pLeft = GreatTree(pre, size, pi);
    pNode->pRight = GreatTree(pre, size, pi);
    return pNode;

}
//前序
void Preorder(BTNode*pNode)
{
    if (pNode == NULL){
        return;
    }
    printf("%c ", pNode->data);
    Preorder(pNode->pLeft);
    Preorder(pNode->pRight);
}

//中序
void Inorder(BTNode*pNode)
{
    if (pNode == NULL){
        return;
    }
    Inorder(pNode->pLeft);
    printf("%c ", pNode->data);
    Inorder(pNode->pRight);
}
//后序
void reorder(BTNode*pNode)
{
    if (pNode == NULL){
        return;
    }
    reorder(pNode->pLeft);
    
    reorder(pNode->pRight);
    printf("%c ", pNode->data);
}

//求节点个数

int GetSize(BTNode *pNode)
{
    if (pNode==NULL)
    {
        return 0;
    }
    //int n = 0;
    //if (pNode->pLeft==NULL&&pNode->pRight==NULL)
    return GetSize(pNode->pLeft) + GetSize(pNode->pRight) + 1;
}

扫描二维码关注公众号,回复: 2305507 查看本文章

//求叶子节点的个数
int GetLeafSize(BTNOde*pNode)
{
    if (pNode == NULL)
        return 0;
    if (pNode->pLeft == NULL&&pNode->pRight == NULL)
        return 1;
    return GetLeafSize(pNode->pLeft) + GetLeafSize(pNode->pRight);
}

//求第K层上的节点个数
int GetLevelkSize(BTNOde*pNode,int k)
{
    if (pNode == NULL)
        return NULL;
    if (k == 1)
        return 1;
    return GetLevelkSize(pNode->pLeft, k - 1) + GetLevelkSize(pNode->pRight,k-1);
}

//查找(判断一个data在不在一个树中)在,返回地址,不在,返回NULL,
BTNOde*Find(BTNOde*pRoot, Datatype data)
{
    if (pRoot == NULL)
        return NULL;
    if (pRoot->data == data)
        return pRoot;
    BTNode*pNode = Find(pRoot->pLeft, data);
    if (pNode != NULL)
    {
        return pNode;
    }
     return  Find(pRoot->pRight, data);
        
}

//求树的高度
int deep(BTNOde*pNode)
{
    if (pNode == NULL)
        return 0;
    int left = deep(pNode->pLeft);
    int right = deep(pNode->pRight);
    return ((left > right) ? left : right)+1;
}

//判断一棵树是否为完全二叉树
void ifall(BTNOde*pNode,int k)
{
    
    if (pNode == NULL)
        return;
    float b = 2;
    int pp = GetLevelkSize(pNode, k-1);
    if (pp != (float)pow(b, k-1))
    {
        printf("否\n");
        return;
        
    }
    ifall(pNode->pLeft,k+1);
    ifall(pNode->pRight,k+1);
}

源文件

实例:

#include"树.h"

int main()
{
    Datatype pre[] = "ABD##E##CF##G##";
    int size = strlen(pre);
    int pi = 0;
    BTNode*pNOde = GreatTree(pre, size, &pi);

        Preorder(pNOde);
        printf("\n");
        Inorder(pNOde);
        printf("\n");

        reorder(pNOde);
        printf("\n");

        printf("节点个数:%d\n", GetSize(pNOde));
        printf("叶子节点个数:%d\n", GetLeafSize(pNOde));
        printf("第K层节点个数:%d\n", GetLevelkSize(pNOde,2));
        Datatype data = 'C';
        BTNOde*pp = Find(pNOde, data);
        //printf("%c的地址:%p\n",pp->data, pp);
        printf("树的深度:%d\n", deep(pNOde));
        int k = deep(pNOde);
        ifall(pNOde,k);
        system("pause");
        return 0;

}

猜你喜欢

转载自blog.csdn.net/xinger_28/article/details/81146342
今日推荐