给出一棵二叉树,返回其节点值的后序遍历。
您在真实的面试中是否遇到过这个题? Yes
样例
给出一棵二叉树 {1,#,2,3},
1
\
2
/
3
返回 [3,2,1]
挑战
你能使用非递归实现么?
都要采用栈,一种更简便的思想是:后序遍历,左节点先于右结点先于根节点被访问,因此,根先入栈,出栈时访问节点。若当前栈顶结点没有左孩子和右孩子或者左孩子节点和右孩子结点都被访问了,则直接访问当前栈顶结点。否则,当前栈顶结点、存在左孩子或右孩子,则依照先入右孩子结点,再入左孩子结点的顺序入栈。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Postorder in vector which contains node values.
*/
public:
vector<int> postorderTraversal(TreeNode *root) {
// write your code here
vector<int> postSeq;
stack<TreeNode *> s;
if(root == NULL){
return postSeq;
}
TreeNode *cur;
s.push(root);
TreeNode * pre = NULL;
while(!s.empty())
{
cur = s.top();
if((cur->left == NULL && cur->right == NULL)||(pre!=NULL)&&(pre == cur->left||pre == cur->right)){
postSeq.push_back(cur->val);//cur栈顶元素为叶节点或者栈顶元素的左右节点已被访问过了,则直接访问栈顶元素
pre = cur;
s.pop();
}else{
if(cur->right != NULL){
s.push(cur->right);
}
if(cur->left != NULL){
s.push(cur->left);
}
}
}
}
};