二叉树的后续遍历
后序遍历二叉树,先访问左子节点,再到右子节点,最后是根节点,上图的访问顺序是3->4->1->5->6->2->0。
使用递归的方案来遍历:
我们来模拟上图的二叉树,图的正方形会存放遍历到的节点;
从根节点开始,往根节点的左子节点遍历,再到1节点的左子节点,3节点是叶子节点,我们就将3节点放入容器;
根据访问流程我们再对1节点的右子节点遍历,4节点是叶子节点,将4节点放入容器;
1节点的左右子节点已经遍历完,再将它放入容器;
根节点的左子节点已经访问完,进行根节点的右子节点遍历,再到2节点的左子节点,5节点是叶子节点,放入容器;
再访问2节点的右子节点,6节点是叶子节点,放入容器;
2节点左右子节点遍历完,放入容器;
最后再放入根节点到容器,上述就是整一个二叉树的后序遍历流程。
以LeetCode-145.二叉树的后续遍历为例子:
遍历的代码如下,使用的是递归方式:
class Solution {
public:
void Search(TreeNode* pNode, vector<int>& vRes) {
if(pNode == nullptr) {
return ;
}
Search(pNode->left, vRes);//先遍历左子节点
Search(pNode->right, vRes);//然后遍历右子节点
vRes.push_back(pNode->val);//最后遍历当前节点
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> vResult;
vResult.clear();
Search(root, vResult);
return vResult;
}
};