【leetcode 后序遍历】Binary Tree Postorder Traversal

时间:2022-02-14 12:26:16

1、题目

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
\
2
/
3

return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?


2、分析

二叉树后序遍历,即按“左右根”的顺序遍历节点,与前一篇文章leetcode 先序遍历一样,有递归法和迭代法。 递归法简洁但效率低。 “后序遍历”迭代法的程序可以复用“先序遍历”的代码,因为“先序遍历”我们实现了“根左右”的迭代版代码,将其改为“根右左”,得出的结果再逆序,就是后序遍历“左右根”的结果。 (先序遍历迭代法的详细分析参考前一篇文章leetcode 先序遍历

3、代码

#递归法

<span style="font-size:18px;">/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
/*递归*/
vector<int> postorderTraversal(TreeNode *root) {
vector<int> result,left_vec,right_vec;
if(!root) return result;
left_vec=postorderTraversal(root->left);
right_vec=postorderTraversal(root->right);
for(vector<int>::iterator iter=left_vec.begin();iter!=left_vec.end();iter++)
result.push_back(*iter);
for(vector<int>::iterator iter1=right_vec.begin();iter1!=right_vec.end();iter1++)
result.push_back(*iter1);
result.push_back(root->val);
return result;
}
};</span>


#迭代法

<span style="font-size:18px;">class Solution {
public:
/*
迭代法 栈
后序遍历“左右根”,可以先按“根右左”遍历,最后逆序一下得到“左右根”的结果
这个解法可以直接利用先序遍历“根左右”的代码,只不过把left、right调一下;
*/
vector<int> postorderTraversal(TreeNode *root) {
/*按“根右左”遍历*/
vector<int> result;
if(!root) return result;
stack<TreeNode *> stk;
stk.push(root);
TreeNode *p=root;
while(!stk.empty())
{
p=stk.top();
stk.pop();
result.push_back(p->val);

if(p->left) stk.push(p->left);
if(p->right) stk.push(p->right);
}
/*由“根右左”->“左右根”*/
for(auto i=result.begin(),j=result.end()-1;i<j;i++,j--)
swap(*i,*j);
return result;
}
};</span>