题目:Given a binary tree, return the postorder traversal of its nodes' values.
思路:
(1)递归方法,递归打印左孩子,递归打印右孩子,打印根节点。
(2)非递归方法,使用栈,逐层push左孩子,如果右孩子为NULL或已经打印过,打印根节点,否则把右孩子重复上述步骤。
递归代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void postOrder(TreeNode *root,vector<int>&vec){
if(root != NULL){
postOrder(root->left,vec);
postOrder(root->right,vec);
vec.push_back(root->val);
}
}
vector<int> postorderTraversal(TreeNode *root) {
vector<int>vec;
postOrder(root,vec);
return vec;
}
};
非递归代码:
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> vec;
if(root == NULL) //空树
return vec;
stack<TreeNode*> st;
TreeNode *tag = NULL;//标志位,记录已经访问过的节点
TreeNode *p = root;
while(p != NULL || !st.empty()){
while(p != NULL){//依次将左孩子入栈
st.push(p);
p = p->left;
}
p = st.top();//取栈顶元素
if(p->right == NULL || p->right == tag){//右孩子为空或者右孩子已经访问过
vec.push_back(p->val);
st.pop(); //弹出栈顶元素
tag = p; //更新标志位
p = NULL; //p置为NULL
}
else{
p = p->right;//否则p设置为右孩子,重复上述步骤
}
}
return vec;
}
};