二叉树?后序遍历!
题目:
给定一个二叉树,返回它的 后序 遍历。
例子:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
题目分析
后序遍历
- 右子树
- 根节点
- 左子树
递归三行解决
不使用递归? 栈 保存节点信息 即可
解题思路
变量 | 作用 |
---|---|
stack < Treenode * > s | 保存节点信息 |
TreeNode * now | 当前遍历的节点 |
过程:
当s非空
取出栈顶元素作为当前节点 now
如果当前节点的左右子树都为空 ==>说明为根节点(输出信息)
如果当前节点的 左子树节点 非空 ==>入栈
如果当前节点的 右子树节点 非空 ==> 入栈
将当前左右子树的节点都置为空
(这样最后遍历到根节点的时候才会输出根节点信息)
代码如下:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(!root) return {};
stack<TreeNode*> s{{root}};
vector<int> ans;
while (!s.empty()) {
TreeNode* now = s.top();
if(now->right == NULL && now->left ==NULL){ //说明无左右子树或者左右子树都已遍历
ans.push_back(now->val); //输出根节点信息
s.pop();
continue;
}
if(now->right) s.push(now->right);
if(now->left) s.push(now->left);
now->left = NULL;
now->right = NULL;
}
return ans;
}
};