数据结构之二叉树

《C程序设计语言》中“统计输入中所有单词出现次数”的程序,采用二叉树数据结构,理解代码实现过程并不顺畅,故梳理一下过程。递归函数理解起来费劲,不过通过一个例子去看整个过程,会容易理解些。

每个不同的单词在树中都是一个节点,每个节点包括四个数据:
1.一个指向该单词内容的指针(注意存储的是地址,单词的内容放在另一个区域)
2.一个统计出现次数的计数值
3.一个指向左子树的指针
4.一个指向右子树的指针
这里写图片描述
如何实现将新的单词加入树中?从数的顶层(即树的根进入),要进入树的根、则需要知道根的地址。所以这个函数有两个参数、第一个是节点的地址、第二个是单词的地址。这个节点的内容可能是空的,因此要考虑这个情况,然后就是考虑单词在节点左边、右边、或此节点上。另外,当一个空的节点存入单词时,申请了一块内存存入新的内容,当然要把这块内存的地址返回赋值给原来空的节点。

struct tnode {
     char *word;
     int count;
     struct tnode* left;
     struct tnode* right;
};
struct tnode* addtree(struct tnode* p, char* w )
{  int cond;

    if(p == NULL)
     {  p = talloc();
        p->word = strdup(w);
        p->count = 1;
        p->left = NULL;
        p->right = NULL;
     }
     else if( (cond = strcmp(p->word, w))==0 )
        p->count++;
     else if( cond < 0)
       p->left =  addtree(p->left,w);
     else
       p->right = addtree(p->right,w);

     return p;
}

这里写图片描述

理解了这个代码后,发现二叉树数据结构和递归函数简直是完美配合。函数的第一层就是根结点、第n次递归到了第n层。随着节点的增多,新加入的单词需要多次递归才能到它的位置上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值