其他分享
首页 > 其他分享> > 用二叉搜索树根据 字典(字符串) 建树 和 后续输出

用二叉搜索树根据 字典(字符串) 建树 和 后续输出

作者:互联网

终于建好树了,太开心了^^^^^^^^^^^^^^^^^^

思路:
一.定义树结点结构

 typedef struct TreeNode
    {
        char ch[20];
        struct TreeNode *left;
        struct TreeNode *right;
    }Tree;

二.写主函数 核心思想

  1. 循环输入字符数组并且建树

  2. 后续输出

  3. 在此之前要做一些准备工作,首先要定义一个字符类型数组并且初始化 char sh[20]={’\0’}; 第二步 定义一个根节点指向NULL ,一定要指向NULL 如果不指向,在建树的时候很容易出错 Tree *root=NULL;
    到这 准备工作就差不多啦,那么接下里就要写主函数中用到的建树函数和后续输出函数了

    int main (void)
    {
    char sh[20]={’\0’};
    Tree *root=NULL;
    while(scanf("%s",sh)!=EOF)//开始输入字典
    {
    if(sh[0]==’#’)//如果违背规则 跳出
    break;
    root = Insert(sh,root);//建立树
    }//建立字典完毕
    PostOderTraversal(root);
    return 0;
    }

三.建树

 if(root==NULL)
    {
        root = malloc(sizeof(Tree));
        strcpy(root->ch,sh);
        root->left = NULL;
        root->right = NULL;

这里 我用到了#include <string.h> strcpy()字符串复制函数。以为不是查找,所以左右孩子一定要指明。
如果不为空 另当别论

  else
        {
            int cmp;
            cmp = strcmp(sh,root->ch);
            if(cmp > 0)
                root->right = Insert(sh,root->right);
    
            if(cmp < 0)
                 root->left = Insert(sh,root->left);
        }

一般的输入数字建立二叉搜索树,比较数值就可以了。那字符串要怎么比较呢?长度?字母?其实是有解决办法的,在#include <string.h> 这个头文件里,有一个函数叫strcmp(),如果串1>串2 返回正数‘;,如果串1<串2 返回负数;相等返回0 。所以这里借用一下这个函数来解决比较大小的问题。

四. 后续输出

  void PostOderTraversal(Tree* root)
    {
        if(root)
        {
            PostOderTraversal(root->left);
            PostOderTraversal(root->right);
            printf("%s,",root->ch);
        }
    }

递归,printf放后面就解决了

代码如下《有写漏的地方,欢迎大家指出来》

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct TreeNode
{
    char ch[20];
    struct TreeNode *left;
    struct TreeNode *right;
}Tree;

Tree* Insert(char *sh,Tree *root)
{
    if(root==NULL)
    {
        root = malloc(sizeof(Tree));
        strcpy(root->ch,sh);
        root->left = NULL;
        root->right = NULL;
    }
    else
    {
        int cmp;
        cmp = strcmp(sh,root->ch);
        if(cmp > 0)
            root->right = Insert(sh,root->right);

        if(cmp < 0)
             root->left = Insert(sh,root->left);
    }
    return root;
}

void PostOderTraversal(Tree* root)
{
    if(root)
    {
        PostOderTraversal(root->left);
        PostOderTraversal(root->right);
        printf("%s,",root->ch);
    }
}

int main (void)
{
    char sh[20]={'\0'};
    Tree *root=NULL;
    while(scanf("%s",sh)!=EOF)//开始输入字典
    {
        if(sh[0]=='#')//如果违背规则 跳出
            break;
        root = Insert(sh,root);//建立树
    }//建立字典完毕
    PostOderTraversal(root);
    return 0;
}

标签:right,Tree,二叉,sh,left,NULL,root,建树,字典
来源: https://blog.csdn.net/weixin_43573750/article/details/93409070