加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

二叉树前中后序遍历及其推导

(2014-09-02 21:31:57)
标签:

遍历二叉树

二叉树的推导

分类: 数据结构及算法

 

博客公告:(1)本博客所有博客文章搬迁至《博客虫》http://www.blogchong.com/

(2)文章对应的源码下载链接参考博客虫网站首页的“代码GIT”直通车;

(3)更多的相关文章更新,以及代码等,请关注博客虫网站,网站中有技术Q群,以及代码共享链接。

目录

1 文档说明... 1

2 二叉树的前中后序遍历算法... 1

3 二叉树的推导... 1

3.1 由前序中序推导... 1

3.2 由中序后序推导... 1

3.3 其他遍历实例... 2

4 文档小结... 2

 

 

1 文档说明

 

         该文档仅作为二叉树学习的笔记记录,包括了前中后序的遍历算法,根据前序中序推导二叉树,或者根据中序后序推导二叉树。

 

2 二叉树的前中后序遍历算法

 

//采用递归的方式进行二叉树的遍历

Status PreOrderTraverse (BiTree T, Status ( * Visit)(TElemType e)) {

//最简单的Vist的函数如下:

// Status PrintElement (TElemType e) {

// printf ( e );   //简单的将遍历的打印

// return OK;

// }

if ( T ) {                                  //若树不空

if (Visit(T -> data)) //若有根节点则访问根节点

if (PreOrderTraverse(T -> lchild, Visit))            //递归遍历左子树

if (PreOrderTraverse(T -> rchild, Visit)) //递归遍历右子树

return OK;

return ERROR;

} else return OK;               //说明已经遍历结束

}

//该遍历为先序遍历,若为中序后序,则调整访问根节点的顺序即可

 

3 二叉树的推导

 

3.1 由前序中序推导

 

已知一棵二叉树的前序序列和中序序列,构造该二叉树的过程如下:

Ø  根据前序序列的第一个元素建立根结点;

Ø  在中序序列中找到该元素,确定根结点的左右子树的中序序列;

Ø  在前序序列中确定左右子树的前序序列;

Ø  由左子树的前序序列和中序序列建立左子树;

Ø  由右子树的前序序列和中序序列建立右子树。

 

3.2 由中序后序推导

 

已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:

Ø  根据后序序列的最后一个元素建立根结点;

Ø  在中序序列中找到该元素,确定根结点的左右子树的中序序列;

Ø  在后序序列中确定左右子树的后序序列;

Ø  由左子树的后序序列和中序序列建立左子树;

Ø  由右子树的后序序列和中序序列建立右子树。

 

3.3 其他遍历实例

 

前序遍历:1 2 4 8 9 10 11 5 3 6 7 (规律:根在前;子树在根后且左子树比右子树靠前);

中序遍历:8 4 10 9 11 2 5 1 6 3 7 (规律:根在中;左子树在跟左边,右子树在根右边);

后序遍历:8 10 11 9 4 5 2 6 7 3 1 (规律:根在后;子树在根前且左子树比右子树靠前);

 

前序遍历:ABDECFG

中序遍历:DBEAFCG

后序遍历:DEBFGCA

 

前序遍历:1 2 4 3 5 7 6

中序遍历:2 4 1 5 7 3 6

后序遍历:4 2 7 5 6 3 1

 

4 文档小结

 

         二叉树作为一种最基本的数据结构是必须要掌握的,无论是树的扩展(包括B/B+/B*/RB树),还是之后堆排序中的完全二叉树,都有一定的关联之处。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有