二叉树的周游算法
- 前序遍历: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)。但最坏的情况发生在不同类型的树木上,因此针对不同种类不同性质的树需要的额外空间有不尽相同。从以上可以明显看出,当树更平衡时,广度优先遍历思想的层级遍历所需的额外空间可能更多,并且当树不太平衡时,深度优先遍历思想的其他三种遍历方式的额外空间可能更多。