• 二叉树的创建、遍历及应用


    如图所示的二叉树:

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #define MAXNODE 10
    
    struct node
    {
        char data;
        struct node *lchild;
        struct node *rchild;
    };
    
    
    struct node *CreatBTree()  //采用递归法,创建二叉树
    {
        struct node *topNode;  //定义1个指向结构体的指针
    
        char ch;
        ch=getchar();  //getchar函数是从输入缓冲区里读出最开头的那个字符的,然后把最先的那个字符删掉
    
        if(ch=='0')
            topNode=NULL;
        else
        {
            topNode=(struct node *)malloc(sizeof(struct node));
            topNode->data=ch;
            topNode->lchild=CreatBTree();//创建左子树
            topNode->rchild=CreatBTree();//创建右子树
        }
        return(topNode);
    }
    
    void printListBTree(struct node *topNode)  //广义表示法输出二叉树
    {
        if(topNode!=NULL)
        {
            printf("%c",topNode->data);
            if((topNode->lchild!=NULL)||(topNode->rchild!=NULL))
            {
                printf("");
                printListBTree(topNode->lchild);
                if(topNode->rchild!=NULL)
                    printf("");
                printListBTree(topNode->rchild);
                printf("");
            }
        }
    }
    
    void preorder(struct node *topNode)  //前序遍历
    {
        if(topNode!=NULL)
        {
            printf("%3c",topNode->data);
            preorder(topNode->lchild);
            preorder(topNode->rchild);
        }
    }
    
    void Inorder(struct node *topNode)  //中序遍历
    {
        if(topNode!=NULL)
        {
            Inorder(topNode->lchild);
            printf("%3c",topNode->data);
            Inorder(topNode->rchild);
        }
    }
    
    void postorder(struct node *topNode)  //后序遍历
    {
        if(topNode!=NULL)
        {
            postorder(topNode->lchild);
            postorder(topNode->rchild);
            printf("%3c",topNode->data);
        }
    }
    
    //层次遍历时,设置一个队列,遍历从根节点开始
    //首先将根节点指针入队列,然后从队列取出一个元素,每取出一个元素进行如下操作:
    //(1)访问该元素所指节点 
    //(2)若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。不断进行该过程,当队列为空时,遍历结束!
    
    void levelorder(struct node *topNode)  //层次遍历
    {
        struct node *queue[MAXNODE];
        int front,rear;
        if(topNode==NULL)
            return;
        front=-1;
        rear=0;
        queue[rear]=topNode;
        while(front!=rear)
        {
            front++;
            printf("%3c",queue[front]->data);  //访问队首节点
            if(queue[front]->lchild!=NULL)     //将队首节点的左孩子节点入队
            {
                rear++;
                queue[rear]=queue[front]->lchild;
            }
            if(queue[front]->rchild!=NULL)    //将队首节点的右孩子节点入队
            {
                rear++;
                queue[rear]=queue[front]->rchild;
            }
        }
    }
    
    //在知道根节点的二叉树中查找数据元素x;查找成功返回该节点的指针,查找失败返回空指针
    
    struct node *Search(struct node *topNode,char x) //在二叉树中查找给定数据
    {
        struct node *p;
        if(topNode==NULL)
            return NULL;
        else
        {
            if(topNode->data==x)
                return topNode;
            else
            {
                if(p=Search(topNode->lchild,x))
                    return p;
                if(p=Search(topNode->rchild,x))
                    return p;
            }        
        }
        return NULL;
    }
    
    int TreeDepth(struct node *topNode) //计算二叉树的深度
    {
        int depleft,depright;
        
        if(topNode==NULL)
        {
            return 0;
        }
        else
        {
            depleft=TreeDepth(topNode->lchild);
            depright=TreeDepth(topNode->rchild);
            if(depleft>depright)
            {
                return depleft+1;
            }
            else
            {
                return depright+1;
            }
        }
    }
    
    int countNode(struct node *topNode) //计算二叉树节点个数
    {
        int count;
        int lnode_num,rnode_num;
    
        if(topNode==NULL)
            count=0;
        else
        {
            
            lnode_num=countNode(topNode->lchild);
            rnode_num=countNode(topNode->rchild);
            count=lnode_num+rnode_num+1;
        }
        return count;
    }
    
    void main()
    {
        char xx;
        struct node *topNode=NULL;
        struct node *BNode;
        int tree_depth; //变量定义为二叉树的深度
        int sum_node;   //变量定义为二叉树节点个数
    
        printf("输入先序序列,虚结点用0表示:
    ");
        topNode=CreatBTree();
    
        printf("用广义法表示的二叉树的输出如下:
    ");
        printListBTree(topNode);
    
        printf("
    二叉树的前序遍历的结果为:
    ");
        preorder(topNode);
    
        printf("
    二叉树的中序遍历的结果为:
    ");
        Inorder(topNode);
    
        printf("
    二叉树的后序遍历的结果为:
    ");
        postorder(topNode);
    
        printf("
    二叉树的层次遍历的结果为:
    ");
        levelorder(topNode);
    
        printf("
    该二叉树的深度为:");
        tree_depth=TreeDepth(topNode);
        printf("%d
    ",tree_depth);
    
        printf("
    该二叉树节点个数为:");
        sum_node=countNode(topNode);
        printf("%d
    ",sum_node);
    
        printf("
    ");
        printf("输入一个待查找的数据:");
        fflush(stdin); //清空输入缓冲区
        scanf("%c",&xx);
        BNode=Search(topNode,xx);
        if(BNode)
            printf("查找成功:%c
    ",*BNode);
        else
            printf("查找失败!
    ");
    
        printf("
    ");
        system("pause");
    }

    结果显示:

  • 相关阅读:
    monkey测试===Monkey测试结果分析(系列三)转
    monkey测试===Monkey测试策略(系列二)转
    Java数据结构——二叉树
    Java排序算法——快速排序
    Java排序算法——归并排序
    Java递归算法——汉诺塔问题
    Java递归算法——二分查找
    Java递归算法——变位字
    Java递归算法——阶乘
    Java递归算法——三角数字
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3296844.html
Copyright © 2020-2023  润新知