博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS数据结构与算法实战 - Binary Tree Traversal
阅读量:5811 次
发布时间:2019-06-18

本文共 1433 字,大约阅读时间需要 4 分钟。

二叉树的周游算法

  • 前序遍历:visit(node),preorder(left Subtree), preorder(right Subtree)。
  • 中序遍历:in-order(left Subtree),visit(node),in-order(right Subtree)。
  • 后序遍历:post-order(left Subtree),post-order(right Subtree),visit(node)。
  • 层级遍历:一层层访问每个节点。

通过上述四种方式遍历二叉树的每个节点。

练习周游算法的技巧 1

思路:一般我们习惯 ,根节点-左节点-右节点,这样的模型,我们就把例如上图A的左子树当做一个块,类似一个大节点用括号圈起来,同样的右子树也这样做。然后每个块里做前中后遍历。

  • 前序遍历。A,(B,D,E),(C,F,G)。得到结果是 A,B,D,E,C,F,G 。

  • 中序遍历。(D,B,E),A,(F,C,G)。得到的结果是 D,B,E,A,F,C,G 。

  • 后序遍历。(D,E,B),(F,G,C),A。得到的结果是 D,E,B,F,G,C,A 。

  • 层级遍历。 A,B,C,D,E,F,G 。

练习周游算法的技巧 2

前序遍历思路:每个节点从左边画线一直到底部这个线,然后按照从左到右的顺序读取节点。 结果是:A,B,D,E,C,F,G 。

中序遍历思路:每个节点从中间画线到底部这个线,然后按照从左到右的顺序读取节点。 结果是 D,B,E,A,F,C,G 。

后序遍历思路:每个节点从右边画线到底部这条线,然后从左到右的顺序读取节点。 结果是 D,E,B,F,G,C,A 。

练习周游算法的技巧 3

前序遍历思路:从每个节点左边画出一个线,然后从根结点开始转一圈,经过每个节点和树的分支,包裹这个树。经过这些短线的顺序就是结果。A,B,D,E,C,F,G 。

中序遍历思路:从每个节点底部边画出一个线,然后从根结点开始转一圈,经过每个节点和树的分支,包裹这个树。经过这些短线的顺序就是结果。D,B,E,A,F,C,G 。

后序遍历思路:从每个节点右边画出一个线,然后从根结点开始转一圈,经过每个节点和树的分支,包裹这个树。经过这些短线的顺序就是结果。D,E,B,F,G,C,A 。

延伸

  • 前序遍历,中序遍历,后续遍历的思想是按照深度优先的顺序遍历的。层级遍历的思想是按照广度优先的顺序遍历的。
  • 由于要遍历树的每个节点因此时间复杂度是O(n)。
  • 广度优先遍历思想的层级遍历需要的额外的空间是O(w),w是这个二叉树的最大的宽,比如Perfect Binary Tree这种情况下最大节点在最后一层,第i层至多拥有2i-1个节点,因此需要额外空间O(Ceil(n/2));深度优先遍历思想的其他三种方式需要额外空间是O(h),这个h是二叉树的最大高度,比如一个平衡树h是Log2(n) ,但是对于极不平衡的左倾斜或者右倾斜树来说h就是n 。所以在最坏的情况下,两者所需的额外空间是O(n)。但最坏的情况发生在不同类型的树木上,因此针对不同种类不同性质的树需要的额外空间有不尽相同。从以上可以明显看出,当树更平衡时,广度优先遍历思想的层级遍历所需的额外空间可能更多,并且当树不太平衡时,深度优先遍历思想的其他三种遍历方式的额外空间可能更多。

Github

转载于:https://juejin.im/post/5cc1817d5188252b8035733b

你可能感兴趣的文章
地址null发布新的JS游戏《吞食蛇永恒激情版》
查看>>
市场营销魔力:欲望的安慰剂效应 - Levels of marketing magic, the placebo effects of desire...
查看>>
SQL日期格式化
查看>>
C#中out和ref之间的区别
查看>>
一步一步教你创建一小型的asp.net mvc 应用程序
查看>>
struts2学习总结
查看>>
关于路杨|About Easun - Easun.org
查看>>
思科初级路由与交换知识测试
查看>>
EDAC检查内存错误
查看>>
javascript oop
查看>>
MFC:重绘Button,定制CButton,自画CPngButton,求赐教(各种bug包括性能bug)谢谢谢谢...
查看>>
eval解析JSON中的注意点
查看>>
这些年的项目管理心得
查看>>
poj 1118 Lining Up(水题)
查看>>
2013年7月11日应付
查看>>
编写可编辑的List控件
查看>>
Android之多媒体扫描过程
查看>>
远程数据库备份到本地出现“Access denied for user 'root'@localhost(using password: YES)”的问题...
查看>>
RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154
查看>>
Java Web----Java Web的数据库操作(三)
查看>>