题目:
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:
二叉树后序遍历规则:
1.遍历左子树
2.遍历右子树
3.遍历根节点
递归实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
void rec(TreeNode* root,vector<int> &ret){
if(root != NULL){
rec(root->left,ret);
rec(root->right,ret);
ret.push_back(root->val);
}
}
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ret;
rec(root,ret);
return ret;
}
};
非递归实现
非递归实现的编程思路如下:
对于节点p:
1. p如果是叶子节点,直接输出。
2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈。(为了保证按照左孩子,右孩子的顺序弹出)。
3. p如果有孩子,而且孩子都已经访问过,则访问p节点。
/**
* Definition for a binary tree node.
* 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> ret;
if(root == NULL) return ret;
TreeNode *p = root;
stack<TreeNode *> toTraversal;
TreeNode *last = root;
toTraversal.push(p);
while (!toTraversal.empty())
{
p = toTraversal.top();
if( (p->left == NULL && p->right == NULL) || (p->right == NULL && last == p->left) || (last == p->right) )
{
ret.push_back(p->val);
last = p;
toTraversal.pop();
}
else
{
if(p->right)
toTraversal.push(p->right);
if(p->left)
toTraversal.push(p->left);
}
}
return ret;
}
};