扫码加入训练营

牢记核心词

学习得礼盒

计算机考研:数据结构常用算法精析(6)

2013-12-11 14:35:35来源:新东方在线编辑

  算法描述: void Inorder-1 (BTptr T) // 中序非递归遍历二叉树T//

  { BTptr p; stacktype s;

  Clearstack(s);

  push (s,T); //置栈S空、根指针进栈//

  while (!Emptystack(s))

  {

  while ((p=Getstop (s))&& p) // 取栈顶且栈顶存在时//

  push(s,p->lchild); //p之左子指针进栈//

  p=pop(s); //去掉最后的空指针//

  if (!Emptystack (s))

  { p=pop(s); //取当前访问结点的指针=>P//

  visit(p); //访问P结点//

  push(s,p-> Rchild); //遍历P之右子树//

  }

  }

  }

  说明:和前序不一样,这里的栈保存的是根结点的地址(因为中序遍历先访问左子树,而根结点没有被访问到。而前序遍历不一样,他一开始就访问根结点,所以他不保存根结点的地址而是保存右子树的地址,因为右子树还没有被访问。总之,用栈就是为了帮我们保存还没有被访问的地址,以便将来我们能找到返回的地址)

  3.后序遍历二叉树的非递归算法

  算法思路:后序非递归遍历较之前序、中序算法要复杂一些。原因是对一个结点是否能访问,要看它的左、右子树是否遍历完,所以每结点对应一个标志位—tag。tag=0,表示该结点暂不能访问;tag=1,表示该结点可以访问。其实是区分这次返回是遍历完左子树返回的还是遍历完右子树返回的,如果是左子树返回那么就不能访问根结点,如果是右子树返回的就能访问根结点。

  当搜索到某P结点时,先要遍历其左子树,因而将结点地址P 及tag=0进栈;当P结点左子树遍历完之后,再遍历其右子树,又将地址P及tag=1进栈;当P结点右子树遍历完后(tag=1),便可以对P结点进行访问。

  栈元素类型: typedef struct

  {BTptr q; // 存放结点地址 //

  int tag; //存放当前状态位//

  }stype ;

考研公开课小程序

本文关键字: 计算机 考研 数据结构

考研英语核心词汇营

背词+听课+练习+督学,学习得礼盒

更多资料
更多>>
更多内容

关注新东方在线考研服务号

获得21考研真题及答案解析

1. 打开手机微信【扫一扫】,识别上方二维码;
2.点击【关注公众号】,获取资料大礼包。

考研资料大礼包
近10年考研真题及答案免费下载
更多>>
更多公开课>>
更多>>
更多资料