二叉树的建立,输出,查找,c/c++描述(上)理论篇

  结束链表的学习后,我们接着学习树。链表是一个前继节点,一个后续节点。树是一个前继节点,多个后续节点。其中最广泛的应用是二叉树,一个节点最多只有两个后继节点。树可能有多个后继节点,也可以用二叉树表示,表示方法是二叉树的左子节点存储其第一个子女节点,二叉树的右子节点存储该节点的第一个兄弟节点,都是从左开始数第一个。每个节点都按如此定义,最终树也可以用这样的二叉树表示。二叉树与树的转换如下图所示:
在这里插入图片描述

  其实二叉树的链式存储与之前文章里写的广义表的存储是类似的。所有新知识都是在原来知识的基础上堆积发展而来的。广义表的节点,用结构体表示,节点内容可以是数据也可以是存储的子表的首元素地址,结构体的另一个指针同普通链表指针,指向链表里的下一节点。而在二叉树的结构体定义里有两个指针成员,分别指向其左子节点和右子节点。还有一个数据成员存储其节点对应的数据。
  学习二叉树,首先要建立二叉树链表。二叉树是逗号表示法如图:A(B,C),父母节点写在括号左边,括号里填写其两个子女节点,中间用逗号,分隔,不允许有空格。子女节点可以为空,也可以是又一个父母节点,如:A(B(C,d),), A和B都是父母节点,都有自己的孩子节点。观察这类括号表达式,其特点是从左到右扫描,依次是父母节点,父母节点的左子节点,子节点的左子节点,再子孙节点的左子节点,然后依次是子孙节点的右子节点,子女节点的右节点,父母节点的右节点,最后为根节点的右子节点。所以这种建立链表的过程,可以用栈来形容,只对栈顶的父母节点进行操作。完成其左右子女节点的建立,然后弹出栈顶的父母节点,对其爷爷奶奶节点进行操作。这个过程和括号表达式表示的意思是对应的。这对于理解栈在此处的应用也是有帮助的。
  完成二叉树的建立后,可以再进行二叉树链表的输出,输出一个逗号表达式。从根节点开始,输出节点存储的数据,如课本,这里也以字符举例。其若有子女节点,则接着输出左括号(,输出左子节点,输出逗号,输出右子节点,输出右括号,对于子节点不存在,则不输出,程序直接return。
  接着说一下,二叉树的遍历。遍历类似于输出,也用了递归的方法。但遍历到每个节点后,取得节点的数据,但并不把节点输出。遍历做到对所有节点不重不漏,以便于对节点数据进行处理。对节点的遍历,分为前序遍历(也有叫先序遍历):父母节点->左子节点->右子节点;中序遍历:左子节点->父母节点->右子节点;后序遍历:左子节点->右子节点->父母节点,层序遍历。注意总是先左子节点,再右子节点。还要注意,这个定义也是递归的。因为二叉树不可能只有这三个节点。如下列图举例所示,誊写自课本,和课本是一模一样的:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
  层序遍历的意思就是从上往下,从左往右,一层一层的遍历二叉树的每一个节点。
  接着就又有了一个新的问题,求二叉树的高度,或者说二叉树的层数。只有根节点,其深度为1.空树的深度为0.其递归定义是:其左右子节点的较大深度加1,即加上其父母节点的深度(为1)。这个深度定义,如同之前文章里写的,求广义表的深度的递归定义:广义表的深度是其所有元素的最大深度加1.
  课本里还介绍了二叉树的两个应用,查找二叉树里是否包含某一元素,若包含,返回其对应的节点地址,若不包含,返回null;返回其所在的层数,若不包含,返回0。都应用了递归算法。因为树里所有节点的是同一结构体类型,子女节点也可以作为其自己子女节点的根节点,继续应用于递归函数。.
谢谢阅读。下篇是课本例题程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值