vlambda博客
学习文章列表

二叉树算法的基本操作

typedef int BTDataType;

typedef struct BinaryTreeNode
{

    BTDataType data;
    struct BinaryTreeNodeleft;
    struct BinaryTreeNoderight;
}BT;

递归实现二叉树的前序、中序、后序遍历

//前序遍历 
void PrevOrder(BT* root)
{
    if(root==NULL)
    {   
        printf("NULL ");
        return;
    }
    printf("%d ",root->data);
    PrevOrder(root->left);
    PrevOrder(root->right);
 } 

//中序遍历
void InOrder(BT* root)
{
    if(root==NULL)
    {
        printf("NULL ");
        return;
    }
    InOrder(root->left);
    printf("%d ",root->data);
    InOrder(root->right);
 } 

//后序遍历
void PostOrder(BT* root)
{
    if(root==NULL)
    {   
        printf("NULL ");
        return;
    }
    PostOrder(root->left);
    PostOrder(root->right);
    printf("%d ",root->data);
 }  

遍历法计算节点个数

int size=0;
void TreeSize(BT* root)
{
    if(root==NULL){
        return;
    }
    size++; 
    TreeSize(root->left);
    TreeSize(root->right);
 } 

分治法计算节点数

int TreeSize2(BT* root)
{
    if(root==NULL)
    {
        return 0;
     } 
    return 1+TreeSize2(root->left)+TreeSize2(root->right);
}

计算叶子节点数

int BTreeLeafSize(BT* root)
{
    if(root==NULL)
    {
        return 0;
    }

    if(root->left==NULL&&root->right==NULL)
    {
        return 1;
    }

    return BTreeLeafSize(root->left)+BTreeLeafSize(root->right);
}

计算第K层的节点数(root为第一层)

int BTreeKLeveLSize(BT* root,int K) 
{
    if(root==NULL)
    {
        return 0;
    }

    if(K==1)
    {
        return 1;
    }

    return BTreeKLeveLSize(root->left,K-1)+BTreeKLeveLSize(root->right,K-1);
}

找到为x的节点

BT* TreeFind(BT* root,int x)
{
    if(root==NULL)
        return NULL;
    if(root->data==x)
        return root;

    BT* ret=TreeFind(root->left,x);
    if(ret!=NULL)
    {
        return root;
    }

    ret=TreeFind(root->right,x);
    if(ret!=NULL)
    {
        return root;
    }
    return NULL;

Stay hungry,Stay Foolish。

求知若饥,虚心若愚