iOS数据结构与算法实战 - Binary Tree Traversal

二叉树的周游算法

  • 前序遍历: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)。
  • 层级遍历:一层层访问每一个节点。

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

练习周游算法的技巧 1

周游算法练习1

思路:通常咱们习惯 ,根节点-左节点-右节点,这样的模型,咱们就把例如上图A的左子树当作一个块,相似一个大节点用括号圈起来,一样的右子树也这样作。而后每一个块里作前中后遍历。git

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

  • 中序遍历。(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 。post

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

练习周游算法的技巧 2

周游算法练习2

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

周游算法练习3

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

周游算法练习4

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

练习周游算法的技巧 3

周游算法练习5

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

周游算法练习6

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

周游算法练习7

后序遍历思路:从每一个节点右边画出一个线,而后从根结点开始转一圈,通过每一个节点和树的分支,包裹这个树。通过这些短线的顺序就是结果。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

github.com/renmoqiqi/1…

相关文章
相关标签/搜索