Binary Tree Postorder Traversal
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?
解法一:递归法
/** * 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> ret; postOrder(root, ret); return ret; } void postOrder(TreeNode* root, vector<int>& ret) { if(root == NULL) return; postOrder(root->left, ret); postOrder(root->right, ret); ret.push_back(root->val); } };
解法二:借助栈的非递归回溯解法。由于不能在树节点中增加visited成员,所以开辟map进行访问记录。
需要注意的是,出栈(即结束访问)有两种情况:
(1)左右节点均为空,即叶节点
(2)左右节点均已访问过
/** * 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> ret; if(root == NULL) return ret; map<TreeNode*, bool> m; //visited stack<TreeNode*> s; s.push(root); m.insert(map<TreeNode*, bool>::value_type(root, true)); while(!s.empty()) { TreeNode* cur = s.top(); while(cur->left) { TreeNode* left = cur->left; map<TreeNode*, bool>::iterator it = m.find(left); if(it == m.end()) {//not visited s.push(left); m.insert(map<TreeNode*, bool>::value_type(left, true)); cur = left; //down left } else break; //cur remains } if(cur->right) { TreeNode* right = cur->right; map<TreeNode*, bool>::iterator it = m.find(right); if(it == m.end()) {//not visited s.push(right); m.insert(map<TreeNode*, bool>::value_type(right, true)); cur = right; //down right } else {//cur finish ret.push_back(cur->val); s.pop(); } } else {//cur finish ret.push_back(cur->val); s.pop(); } } return ret; } };
解法三:在Discussion看到一种神一样的解法。
前序是:根左右
后续是:左右跟
因此可以将前序改为根右左,然后逆序为左右根输出。
前序遍历不需要回溯(对应图的深度遍历),是一种半层次遍历,因此效率很高。
/** * 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> ret; if(root == NULL) return ret; stack<TreeNode*> s; s.push(root); while(!s.empty()) { TreeNode* cur = s.top(); s.pop(); ret.push_back(cur->val); if(cur->left) s.push(cur->left); if(cur->right) s.push(cur->right); } reverse(ret.begin(), ret.end()); return ret; } };
时间: 2024-10-23 10:55:03