二叉树
在满二叉树中,每一层节点都达到了最大个数。
完全二叉树的每一个节点都与满二叉树中的节点对应。
#抽象数据类型
|
|
#部分成员函数的实现
|
|
#遍历
令L、R、V分别代表遍历一个节点的左子树、右子树和访问该节点的操作,则遍历二叉树有6种规则:VLR、LVR、LRV、VRL、RVL和RLV。若规定先左后右,则只剩三种规则,即VLR(前序遍历)、LVR(中序遍历)和LRV(后序遍历)。这三种遍历过程的路线其实是相同的,只是结果不同。对于每种遍历,每个节点都要经过三次,只不过前序遍历在第一次遇到节点时立即访问,中序遍历在第二次遇到节点时访问,后序遍历要到第三次遇到节点时才访问。
##遍历的递归算法
中序遍历。
|
|
中序遍历可能会丢失信息。
前序遍历。
|
|
##遍历的应用
###后序遍历的应用
计算二叉树的节点个数,可以遍历根节点的左子树和右子树,分别计算出左右子树的节点个数,然后把访问根节点的语句改为相加。
|
|
计算二叉树高度的思路与前面类似。
|
|
###前序遍历的应用
复制构造函数。
|
|
判断两棵树是否相等。
|
|
##遍历的非递归算法
要把递归改为非递归,一般需要一个工作栈,记录遍历时的回退路径。
###前序遍历
|
|
另一种思路,进栈时先进右子女,后进左子女。
|
|
###层次序遍历
按层次顺序访问二叉树的处理需要利用一个队列。
|
|
###中序遍历的非递归算法
类似前序遍历。
|
|
|
|