• 树的基本操作(C语言)


    代码
    #include <cstdio>
    #include
    <cstdlib>
    #include
    <queue>
    #include
    <algorithm>
    using namespace std;

    typedef
    struct _btree
    {
    int data;
    struct _btree *left;
    struct _btree *right;
    }btree,
    *ptree;

    ptree BuildTree(
    int data[]);
    void PrintTree(ptree ptr);
    void CountLeaf(ptree ptr,int &count);
    void leaveorderoutput(ptree ptr);
    int depth(ptree ptr);
    void countElem(ptree ptr,int &elem);
    ptree copyTree(ptree ptr);
    void DeleteTree(ptree ptr);

    int main(void)
    {
    int array[10];
    int count=0;
    int countelem=0;
    for(int i=0;i<10;i++)
    {
    array[i]
    =rand()%10;
    }

    for(int i=0;i<10;i++)
    {
    printf(
    "%d ",array[i]);
    }
    printf(
    "\n");
    ptree root
    =BuildTree(array);

    PrintTree(root);
    printf(
    "\n");

    CountLeaf(root,count);
    printf(
    "CountLeaf:%d\n",count);

    leaveorderoutput(root);
    printf(
    "\n");
    int depthval=depth(root);
    printf(
    "depth:%d\n",depthval);
    countElem(root,countelem);
    printf(
    "count elem:%d\n",countelem);

    ptree root2
    =copyTree(root);
    PrintTree(root2);
    printf(
    "\n");

    DeleteTree(root);
    DeleteTree(root2);
    }

    ptree BuildTree(
    int data[])
    {
    ptree root
    =NULL;
    int i=0;
    root
    =(ptree)malloc(sizeof(btree));
    root
    ->data=data[i++];
    root
    ->left=NULL;
    root
    ->right=NULL;
    ptree ptr
    =root,pre;
    while(i!=10)
    {
    ptr
    =root;
    while(ptr != NULL)
    {
    pre
    =ptr;
    if(data[i]>ptr->data)
    {
    ptr
    =ptr->left;
    }
    else
    {
    ptr
    =ptr->right;
    }
    }

    ptr
    =(ptree)malloc(sizeof(btree));
    ptr
    ->data=data[i++];
    ptr
    ->left=NULL;
    ptr
    ->right=NULL;

    if(ptr->data > pre->data)
    {
    pre
    ->left=ptr;
    }
    else
    {
    pre
    ->right=ptr;
    }
    }

    return root;
    }

    void PrintTree(ptree ptr)
    {
    if(ptr != NULL)
    {
    PrintTree(ptr
    ->left);
    printf(
    "%d ",ptr->data);
    //PrintTree(ptr->left);
    PrintTree(ptr->right);
    }
    }

    void CountLeaf(ptree ptr,int &count)
    {
    if(ptr != NULL)
    {
    if(ptr->left == NULL && ptr->right == NULL)
    {
    ++count;
    }
    CountLeaf(ptr
    ->left,count);
    CountLeaf(ptr
    ->right,count);
    }
    }

    void leaveorderoutput(ptree ptr) // 显示每层元素
    {
    queue
    <ptree> q;
    ptree p;

    q.push(ptr);

    while(!q.empty())
    {
    p
    =q.front();
    q.pop();
    printf(
    "%d ",p->data);
    if(p->left != NULL)
    {
    q.push(p
    ->left);
    }
    if(p->right != NULL)
    {
    q.push(p
    ->right);
    }
    }
    }

    int depth(ptree ptr)
    {
    int depthLeft,depthRight,depthval;

    if(ptr == NULL)
    {
    depthval
    =-1;
    }
    else
    {
    depthLeft
    =depth(ptr->left);
    depthRight
    =depth(ptr->right);
    depthval
    =1+(depthLeft>depthRight ? depthLeft:depthRight);
    }
    return depthval;
    }

    void countElem(ptree ptr,int &elem)
    {
    if(ptr != NULL)
    {
    ++elem;
    countElem(ptr
    ->left,elem);
    countElem(ptr
    ->right,elem);
    }
    }

    ptree copyTree(ptree ptr)
    {
    ptree newLeft,newRight,newNode;
    if(ptr==NULL)
    {
    return NULL;
    }

    newLeft
    =copyTree(ptr->left);
    newRight
    =copyTree(ptr->right);
    newNode
    =(ptree)malloc(sizeof(btree));
    newNode
    ->data=ptr->data;
    newNode
    ->left=newLeft;
    newNode
    ->right=newRight;
    return newNode;
    }

    void DeleteTree(ptree ptr)
    {
    if(ptr != NULL)
    {
    DeleteTree(ptr
    ->left);
    DeleteTree(ptr
    ->right);
    free(ptr);
    }
    }
  • 相关阅读:
    【读书笔记】房龙-人类的故事
    【读书笔记】曼昆-经济学原理:宏观经济学分册
    【读书笔记】曼昆-经济学原理:微观经济学分册
    ES6数组去重
    switch语句
    if语句的优化
    程序的三大结构
    NaN
    js中常见的数据类型
    变量的命名规则
  • 原文地址:https://www.cnblogs.com/linyilong3/p/1858987.html
Copyright © 2020-2023  润新知