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]
.
题意是要求二叉树的后序遍历,那么一般也是有两种遍历方法,一种是递归,一种是非递归。
递归版本如下:
Code:(LeetCode运行3ms)
/**
* 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> visit;
postorderTraversal(root, visit);
return visit;
}
void postorderTraversal(TreeNode* root, vector<int> &visit) {
if (root) {
postorderTraversal(root -> left, visit);
postorderTraversal(root -> right, visit);
visit.push_back(root -> val);
}
}
};
Code:(LeetCode运行0ms)
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode *> s;
vector<int> visit;
//s.push(NULL);
TreeNode *pointer = root;
do {
while (pointer != NULL) { //先找到最左的结点,其中要把每个未访问的都入栈
s.push(pointer);
pointer = pointer -> left;
}
TreeNode *hadvisited = NULL;
while (!s.empty()) {
pointer = s.top();
s.pop();
if (pointer -> right == hadvisited) {
visit.push_back(pointer -> val);
hadvisited = pointer;
} else {
s.push(pointer);//二次入栈,因为还没访问
pointer = pointer -> right;
break;
}
}
} while (!s.empty());
return visit;
}
};