二叉树后续遍历递归方式

91 阅读1分钟

二叉树的后续遍历

1-1.png

后序遍历二叉树,先访问左子节点,再到右子节点,最后是根节点,上图的访问顺序是3->4->1->5->6->2->0。

使用递归的方案来遍历:

MTVideo.GIF

我们来模拟上图的二叉树,图的正方形会存放遍历到的节点; 2-1.png

2-2.png

2-3.png

从根节点开始,往根节点的左子节点遍历,再到1节点的左子节点,3节点是叶子节点,我们就将3节点放入容器;

2-4.png

2-5.png

根据访问流程我们再对1节点的右子节点遍历,4节点是叶子节点,将4节点放入容器;

2-6.png

1节点的左右子节点已经遍历完,再将它放入容器;

2-7.png

2-71.png

2-8.png

根节点的左子节点已经访问完,进行根节点的右子节点遍历,再到2节点的左子节点,5节点是叶子节点,放入容器;

2-9.png

2-10.png

再访问2节点的右子节点,6节点是叶子节点,放入容器;

2-11.png

2节点左右子节点遍历完,放入容器;

2-12.png

最后再放入根节点到容器,上述就是整一个二叉树的后序遍历流程。

以LeetCode-145.二叉树的后续遍历为例子:

640.png

遍历的代码如下,使用的是递归方式:

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;
    }
};