描述
给定一个二叉树,返回他的后序遍历的序列。
后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。
数据范围:二叉树的节点数量满足 1 \le n \le 100 \1≤n≤100 ,二叉树节点的值满足 1 \le val \le 100 \1≤val≤100 ,树的各节点的值各不相同
样例图
示例1
输入:
{1,#,2,3}
返回值:
[3,2,1]
说明:
二叉树的后续遍历,简单来说就是“左右根”,展开来说就是优先访问根节点的左子树的全部节点,然后再访问根节点的右子树的全部节点,最后再访问根节点。对于每棵子树的访问也按照这个逻辑,因此叫做“左右根”的顺序。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
// write code here
vector<int> res;
recursion(root,res);
return res;
}
void recursion(TreeNode* root,vector<int> &res)
{
if(root==nullptr)return;
//先递归它的左边
recursion(root->left,res);
//再递归它的右边
recursion(root->right,res);
//最后是它的根节点
res.push_back(root->val);
}
};
总结:要理解二叉树的递归,递归它左子树和右子树本身可以看做一个指针后移的过程,当走到一个节点没有左节点时,如果是前序遍历就开始指针指向它的右节点(利用遍历函数传右值),如果是中序遍历,就返回它的值,指针再指向它的右节点,如果是后序遍历,指针就直接指向它的右节点,等右节点遍历完了,再返回它本身的值。