tree traversal (树的遍历) - 后序遍历 (postorder traversal) - 二叉树的后序遍历

tree traversal (树的遍历) - 后序遍历 (postorder traversal) - 二叉树的后序遍历

1. tree traversal (树的遍历)

1.1 深度优先搜索 (depth-first search,DFS)

我们采用深度作为优先级,从根节点开始一直到达某个确定的叶子节点,然后再返回根节点到达另一个分支。深度优先搜索策略可以根据根节点、左孩子树和右孩子树的相对顺序被细分为前序遍历、中序遍历和后序遍历。

前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)

1.2 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。

下图中的节点依照不同的策略遍历,访问的顺序均为 1, 2, 3, 4, 5。宽度优先搜索划分层次为 [[1], [2, 3], [4, 5]]
在这里插入图片描述

递归实现的效率一般比对应的非递归实现低。如果在函数中使用了两个递归调用,效率低下的问题就会变得更为严重。

2. 二叉树的后序遍历

给定一个二叉树,返回它的后序遍历。

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [1,2,3]
int* preorderTraversal(struct TreeNode* root, int* returnSize)

输入参数 rootNULL 时,如果 return NULL*returnSize 必须设置为 0

2.1 迭代实现 - 数组模拟栈 (stack) 的操作

从根节点开始依次迭代,弹出栈顶元素输出到输出列表中,然后依次压入它的所有孩子节点,按照从上到下、从左至右的顺序依次压入栈中。因为深度优先搜索后序遍历的顺序是从下到上、从左至右,所以需要将输出列表逆序输出。

时间复杂度:访问每个节点恰好一次,因此时间复杂度为 O(N),其中 N 是节点的个数,也就是树的大小。
空间复杂度:取决于树的结构,最坏情况需要保存整棵树,因此空间复杂度为 O(N)


3. 后序遍历 (postorder traversal)

前序遍历 (preorder traversal) 先沿左侧通路自顶而下访问沿途节点,再自底而上依次遍历这些节点的右子树。

迭代式后序遍历 (出栈节点以深色示意)

References

https://leetcode-cn.com/

发布了525 篇原创文章 · 获赞 1873 · 访问量 116万+

猜你喜欢

转载自blog.csdn.net/chengyq116/article/details/105149918