全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
3428 9
2015-04-04
复制代码

相信大家对树的各种递归的遍历很了解,利用递归使得代码变得简单而且比较好理解,但是利用递归是需要代价的,特别是当递归层次比较深的时候,可能会导致递归栈溢出。而且递归一般运行速度比较慢,那么这种情况下,我们就可以采用非递归来实现,非递归相对递归来说,代码相对比较难理解,而且代码量也一般比较多,可是它的执行效率却是很不错的。
在树的中序非递归遍历中需要用到栈,在层次遍历中需要用到队列,非递归中序遍历的思想如下:

  • 先设一个栈st和一个指向树根的指针pVal ,用pVal 指指向结点的m_pLeft(左孩子)并顺其而下直到pVal ==NULL跳出循环,在这一过程中把每个节点入栈,则此时的pVal 指向的是树的最左结点。
  • 栈顶元素出栈以访问最左结点。(此步很重要,是为了实现按栈内元素的顺序后入先出访问结点访问最左结点的根结点。栈内元素逐一退栈即为中序遍历的元素顺序。)
  • 访问最左结点的根结点。
  • 由于将右子树理解为一个子树,对其的遍历也是采用中序遍历的方法,故将右子树的根结点理解为开始遍历树时的根结点,故可用语句pVal = pVal->m_pRight,则又开始了对一个树的遍历,pVal 指针又会走遍右子树的每一个结点。

非递归中序遍历的思想如下:

  • 按层次遍历需要一个队列,开始将二叉树的头结点入队
  • 然后每次从队列中删除一个节点并输出节点信息,接下来把它的非空
  • 左右孩子入队,下一个输出的位它的右面堂兄弟或兄弟节点信息,在把它的
  • 左右孩子入队,这两个孩子在上面两个孩子的后面(紧跟其后)
  • 这样当队列为空时算法结束


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-4-4 15:06:27
C的算法,用python实现会简洁的多,如果用F#之类的函数语言更简洁。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-4 21:01:27
  • --贴段MS SQL SERVER代码,CTE递归查询,与Lisrelchen探讨。


  • --执行环境:SQL Server 2008



  • IF OBJECT_ID('MENU') IS NOT NULL DROP TABLE MENU;

  • CREATE TABLE MENU
  • (
  •     name nvarchar(50) NOT NULL PRIMARY KEY,
  •     senior nvarchar(50) NULL
  • );
  • INSERT INTO MENU values
  •     ('文件',NULL),
  •     ('新建','文件'),
  •     ('项目','新建'),
  •     ('使用当前连接查询','新建');

  • ;WITH lmenu(name,senior,level) as
  • (
  •     SELECT NAME,SENIOR,0 level FROM MENU WHERE SENIOR IS NULL
  •     UNION ALL
  •     SELECT A.NAME,A.SENIOR,b.level+1 FROM MENU A,lmenu b
  •     where a.senior = b.name
  • )
  • SELECT *  from lmenu;



QQ截图20150404210002.png

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-5 07:34:53
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-5 08:26:45
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-5 08:56:01
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群