设计算法统计所有单孩子结点的个数_数据结构与算法——二叉树

5f002978b70a97a382ce9b845b5df061.png

SHUO ZAI QIAN MIAN

说 在 前 面

这里是中国传媒大学,19广电工2班的公众号,一切内容仅供班级成员及感兴趣的同学学习参考,请勿用作其他用途。作者也是在校学生,水平有限,内容难免有所缺漏,请大家不吝赐教!

btw. 受手机屏幕及公众号格式限制,代码看起来可能有点费劲,可以点击下方“阅读原文”获取CSDN博客链接,在电脑上打开。

5f002978b70a97a382ce9b845b5df061.png

二叉树

这篇博客主要针对代码实现,有关树和二叉树的基本概念书上讲的贼清楚,我觉得我再讲一遍也不会讲的比书上好了,所以大家如果基本概念有问题,直接看书吧 ^ ç ^

二叉树的存储结构

二叉树的存储结构有顺序存储结构链式存储结构两种,其中顺序存储结构的操作相对简单,但在二叉树较空的情况下空间利用率很低,所以在实际应用中,链式存储结构的应用更广泛。

链式存储结构

二叉树的链式存储结构中,每个节点都包含如下成分:

struct BTNode{
     //"二叉树点"
    ElemType data; //用define把char定义为ElemType
    BTNode *lc,*rc; //lc是"left child"左孩子,rc是"right child"右孩子
};

data存储数据,lcrc分别指向左、右节点,相当于每个节点都有两个指针域的链表


二叉树的算法设计

在下面的代码中,部分代码用到STL中的栈stack和队列queue,头文件分别为STL中的栈和队列采用类的成员函数的形式调用,这很方便地提供了一种可用的栈和队列的结构。

对栈和队列还不太熟悉的可以看一下之前的文章:

数据结构与算法——栈

数据结构与算法——队列

里面提到了栈和队列的基本思想,以及STL库的简单用法。

用字符串建立二叉树

二叉树有一种表示法为括号表示法,本算法的功能是读取一段括号表示法的二叉树,把它转化为链式存储结构的二叉树。

要成功设计本算法,就要先弄懂什么是括号表示法

什么是括号表示法?

括号表示法:将树的根结点写在括号的左边,除根结点外的其余节点写在括号中,并用逗号分隔

在二叉树中,除叶子结点外,每个节点都有两个子结点——左孩子和右孩子,所以“括号”的形式被固定下来了:父结点(左孩子,右孩子),比如:

  • A(B,C)是指这样的一个二叉树:

    4b3fe1bd5d4315f41579a07a69cc7231.png
    简单的二叉树
  • A(B, )则是这样的:

    5343b0e6c7d44602eae400ac3aac270e.png
    没有C的更简单二叉树

我们推广“左孩子”和“右孩子”的定义——不光是结点,我们把子树也看作孩子,那么:

  • 对于A(B,C(D,E))A的左孩子是B,右孩子是一颗子树C(D,E),这棵子树是这样的:

    89c224fd6a61e13d119b76cc07b564de.png
    子树C
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值