题干
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) {}
* };
*/
解题思路
这个题的思路是用辅助栈来维护整个输出序列。
先遍历左子树,压栈,然后右子树,压栈,遇到叶子结点,出栈,直接添加到 vector中。并且将其置为NULL防止重复访问。
看栈顶结点,继续做上述操作。
例子:
1
/ \
2 3
/ / \
4 6 7
\
5
1 2 4 进栈
5进栈->叶子结点,出栈
4->叶子结点,出栈
2->叶子结点,出栈
3 6进栈
6->叶子结点,出栈
7进栈
7->叶子结点,出栈
3->叶子结点,出栈
1->叶子结点,出栈
最后序列为:
5426731
参考代码
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
TreeNode *pre,*cur=root;
vector<int> postorder;
stack<TreeNode *>tree;
while(cur!=NULL){//将左子树直接压栈,这部分代码其实可以删减
tree.push(cur);
pre=cur;
cur=cur->left;
}
cur=pre;
while(!tree.empty()){//分情况讨论,有左子树
if (cur->left!=NULL){
tree.push(cur->left);
cur=cur->left;
continue;
}
else if (cur->left==NULL&&cur->right!=NULL){//没有左子树,有又子树
tree.push(cur->right);
cur=cur->right;
continue;
}
else if (cur->left==NULL&&cur->right==NULL){//是叶子结点
postorder.push_back(cur->val);
pre=cur;
tree.pop();
if (tree.empty()) break;
cur=tree.top();
if (pre==cur->left)
cur->left=NULL;
else cur->right=NULL;
continue;
}
}
return postorder;
}
};
易错点
循环跳出
1.处理完每个结点要continue跳出本次循环
2.如果中间出现了栈已经空了的话直接跳出处理。
感想
总体来说这个题挺简单,但是代码写的比较复杂,应该可以简洁一点。