数据结构与算法分析笔记(c++)_二叉树

4.2二叉树
二叉树(binary tree)是一棵每个结点都不能有多于两个儿子的树。
叉树的个性质是平均二义树的深度要比结点个数N小得多
分析表明,这个平均深度为O(√N),而对于特殊类型的二叉树,即二叉查找树(binary search tree),其深度的平均值是O(logn)。遗憾的是,这个深度也可以大到N-1。

在这里插入图片描述
4.2.1实现
因为个二义树结点最多有两个儿子,所以可以直接链接到它们。树结点的声明在结构上类似于双向链表的声明。在声明中,个结点就是由 element(元素)的信息加上两个到其他结点的引用(left和righ)组成的结构(见图4-13)。在这里插入图片描述
树一般画成用一些直线连接起来的圆圈因为一义树实际上就是图(graph)。当涉及树时,我们也不显式地画出NULL链,因为具有N个结点的每一棵二叉树都将需要N+1个NULL链。
二叉树有许多与搜索无关的重要应用。二叉树的主要用处之一是在编译器的设计领域,
4.2.2一个例子——表达式树
表达式树(expression tree)。表达式树的树叶是操作数(operand),如常数或变量名字,而其他的结点为操作符(operator)。由于这里所有的操作都是二元的,因此这棵特定的树正好是二叉树,虽然这是最简单的情况,但是结点还是有可能含有多于两个的儿子
通过递归计算左子树和右子树所得到的值应用在根处的操作符上而算出表达式树T的值在这里插入图片描述

例子中,左子树的值是a+(bc),右子树的值是(de)+f)g,因此整个树表示(a+(bc)+(((d*e)+f)*g)
可以通过递归地产生一个带括号的左表达式,然后打印出在根处的操作符,最后再递归地产生一个带括号的右表达式而得到一个(对两个括号整体进行运算的)中缀表达式(infix expression)。这种一般的方法(左,结点,右)称为中序遍历(inorder traversal);由于其产生的表达式类型,这种遍历很容易记忆。
另—个遍历策略是递归地打印岀左子树、右子树,然后打印操作符。这种遍历策略一般称为后序遍历(postorder traversal)。
第三种遍历策略是先打印出操作符,然后递归地打印出左子树和右子树。这是不太常用的前缀(prefix)记法,这种遍历策略称为前序遍历(preorder traversal)。
构造一棵表达式树:
下面给出一种算法来把后缀表达式转变成表达式树
所描述的方法酷似3.6.3节的后缀求值算法。我们一次一个符号地读入表达式。如果符号是操作数,那么就建立一个单结点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树T1和T2(T先弹出)并形成棵新的树,该树的根就是操作符,它的左、右儿子分别是T2和T1。然后将指向这棵新树的指针压入栈中在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值