时间:2020年10月18日
示例:
了解:二叉树的后序遍历的访问顺序为先访问左孩子结点,再访问右孩子结点,最后访问根节点。
方法:
(1)递归
void PostOrder(TreeNode *root,vector<int>&ans){
if(root== nullptr)
return;
PostOrder(root->left,ans); //先访问左孩子结点
PostOrder(root->right,ans); //再访问右孩子结点
ans.emplace_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root){
vector<int>ans;
PostOrder(root,ans);
return ans;
}
(2)迭代
我们知道前序遍历是根—>左—>右,后续遍历是左—>右—>根,那么我们只需要调整一下前序遍历的代码顺序,让其变成根—>右—>左的遍历顺序,然后再反转存储结点值的数组,输出的结果顺序就是左—>右—>根了。前序遍历的迭代版本见博文[C++]leetcode144题解之二叉树的前序遍历。
vector<int> postorderTraversal(TreeNode *root) {
vector<int> ans;
if(root== nullptr)
return ans;
stack<TreeNode *>s;
s.push(root);
while(!s.empty()){
auto cur=s.top();
s.pop();
ans.emplace_back(cur->val); //存储根节点的值
if(cur->left!= nullptr)
s.push(cur->left); //如果左孩子不为空,则存储左孩子的值
if(cur->right!= nullptr)
s.push(cur->right); //如果右孩子不为空,则存储右孩子的值
}
reverse(ans.begin(),ans.end()); //反转结果
return ans;
}
收获:
(1)、对二叉树的遍历的知识进一步掌握。
(2)、对二叉树后序遍历的迭代版本更加了解,明天可以试着做一下二叉树的中序遍历的迭代版本。
今天状态太差了,上火加看报文看的头晕,希望明天能够好好调整一下!!!