Hanoi 与二叉树的中序遍历

Hanoi 与二叉树的中序遍历

Author : eryar@163.com

Key Words : Hanoi , Binary Tree, Traversal

Description : 对比Hanoi的程序与二叉树的中序遍历算法, 可知Hanoi问题即是用二叉树的中序遍历来解决的。

一、 Hanoi 

   汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。

图1 Hanoi

后来,这个传说就演变为汉诺塔游戏: 

  1.有三根杆子A,B,C。A杆上有若干碟子 

  2.每次移动一块碟子,小的只能叠在大的上面 

  3.把所有碟子从A杆全部移到C杆上

  经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:

  如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

  此外,汉诺塔问题也是程序设计中的经典递归问题。

  算法思路:

  1.如果只有一个金片,则把该金片从源移动到目标棒,结束。

  2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒.

  3.单纯对于有N个金片要挪动的步数求出, 可以使用递推方法,满足递推方程f(i) = f(i - 1) * 2 + 1.

二、二叉树的遍历

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。

遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

1.遍历方案

  从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部   

 分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

  (1)访问结点本身(N),

  (2)遍历该结点的左子树(L),

  (3)遍历该结点的右子树(R)。

  以上三种操作有六种执行次序:NLR、LNR、LRN、NRL、RNL、RLN。

注意:

  前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

2.三种遍历的命名

  根据访问结点操作发生位置命名:

  ① NLR:前序遍历(PreorderTraversal亦称(先序遍历))

  ——访问结点的操作发生在遍历其左右子树之前。

  ② LNR:中序遍历(InorderTraversal)

  ——访问结点的操作发生在遍历其左右子树之中(间)。

  ③ LRN:后序遍历(PostorderTraversal)

  ——访问结点的操作发生在遍历其左右子树之后。

注意:

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

3. 遍历算法

  1.中序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1)遍历左子树;

  (2)访问根结点;

  (3)遍历右子树。

  2.先序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1) 访问根结点;

  (2) 遍历左子树;

  (3) 遍历右子树。

  3.后序遍历得递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1)遍历左子树;

  (2)遍历右子树;

  (3)访问根结点。

  4.中序遍历的算法实现

  用二叉链表做为存储结构,中序遍历算法可描述为:

  void InOrder(BinTree T)

  { //算法里①~⑥是为了说明执行过程加入的标号

  ① if(T) { // 如果二叉树非空

  ② InOrder(T->lchild);

  ③ printf("%c",T->data); // 访问结点

  ④ InOrder(T->rchild);

  ⑤ }

  ⑥ } // InOrder

三、Hanoi塔程序

对比Hanoi的程序与二叉树的中序遍历算法, 可知Hanoi问题即是用二叉树的中序遍历来解决的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值