1 题目描述
求给定的二叉树的后序遍历。
例如:
给定的二叉树为{1,#,2,3},
1
\
2
/
3
返回[3,2,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?
示例1
输入
{1, #, 2, 3}
输出
[3, 2, 1]
解题思路
递归:
- 递归终止条件:如果根结点为空,则返回空向量
- 递归体:否则:
2.1. 递归遍历左子树,将递归遍历左子树的结果向量合并到返回向量中
2.2. 递归遍历右子树,将递归遍历右子树的结果向量合并到返回向量中
2.3. 将根结点的 val 推入返回向量的尾部 - 返回返回向量
代码实现
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型vector
*/
vector<int> postorderTraversal(TreeNode* root) {
// write code here
vector<int> vectorInt;
if(root == NULL) return vectorInt;
// 遍历左子树
vector<int> vectorIntRight = postorderTraversal(root->left);
vectorInt = mergeVectorInt(vectorInt, vectorIntRight);
// 遍历右子树
vector<int> vectorIntLeft = postorderTraversal(root->right);
vectorInt = mergeVectorInt(vectorInt, vectorIntLeft);
// 遍历根结点
vectorInt.push_back(root->val);
return vectorInt;
}
/**
* 合并向量1和向量2
* @param v1 向量1
* @param v2 向量2
* @return 合并向量1和向量2后的向量
*/
vector<int> mergeVectorInt(vector<int> v1, vector<int> v2){
if(v2.size() == 0) return v1;
for(int i = 0; i < v2.size(); i++)
v1.push_back(v2[i]);
return v1;
}
};
运行结果
运行时间:3ms
占用内存:504k