1 题目
用递归的方法对给定的二叉树进行后序遍历。
例如:
给定的二叉树为{1,#,2,3},
返回[3,2,1].
示例1
输入
{1,#,2,3}
输出
[3,2,1]
2 解法
2.1 递归解法
/*** 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 herevector<int> res;if (root == nullptr)return res;if (root->left != nullptr) {vector<int> left_res = postorderTraversal(root->left);for (int i = 0; i < left_res.size(); i++) {res.push_back(left_res[i]);}}if (root->right != nullptr) {vector<int> right_res = postorderTraversal(root->right);for (int i = 0; i < right_res.size(); i++) {res.push_back(right_res[i]);}}res.push_back(root->val);return res;}
};
性能还可以:
2.2 非递归解法
后续遍历,首先是遍历左节点,然后是右节点,最后是自身,所以可以通过栈的方式,放入自身,然后放右节点,最后是左节点,然后检查栈顶,如果是叶子节点,那么遍历,出栈.如果发现其有左/右子节点,不可以直接把左/右子节点入栈(因为左右子节点遍历过了之后继续入栈会陷入死循环), 要先检查一下,设置一个标记前一个出栈节点的标记指针,如果这个前一个出栈节点不是自己的左右子节点(且不能为空),那么说明他的左右子节点还没有遍历过,那么左右子节点入栈,否则遍历自身且出栈:
/*** 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 herevector<int> res;if (root != nullptr) {stack<TreeNode*> tS;tS.push(root);TreeNode* pre = nullptr;while(!tS.empty()) {TreeNode* tN = tS.top();if ((tN->left == nullptr && tN->right == nullptr) ||(pre != nullptr && (pre == tN->left || pre == tN->right))) {res.push_back(tN->val);tS.pop();pre = tN;} else {if (tN->right != nullptr)tS.push(tN->right);if (tN->left != nullptr)tS.push(tN->left);}}}return res;}
};