二叉树的后序遍历(非递归)

╰+哭是因爲堅強的太久メ 2023-05-31 07:26 205阅读 0赞

二叉树的后序遍历

题目描述 :

后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]
1
\
2
/
3

输出: [3,2,1]

来源:力扣(LeetCode)
OJ链接

相关:
二叉树的前序遍历(非递归)
二叉树的中序遍历(非递归)
二叉树的层序遍历(非递归)

分析 :

非递归的后序遍历就比较复杂了, 需要两个栈来实现, 一个栈来入栈左右孩子, 另一个栈作为入栈的节点的标记, 每一个节点都对应一个标记, 标记什么呢? 标记这个结点是否还有左孩子, 也就是意味着弹出栈顶到这个节点时是否出栈或是访问其右节点, 具体来看代码

  1. class Solution {
  2. public:
  3. vector<int> postorderTraversal(TreeNode* root) {
  4. stack<TreeNode*> st;
  5. stack<bool> tag;
  6. vector<int> res;
  7. TreeNode* cur = root;
  8. while (cur||!st.empty()) {
  9. for (; cur; cur = cur->left) {
  10. st.push(cur);
  11. tag.push(false);
  12. }
  13. while (!st.empty() && tag.top()) {
  14. res.push_back(st.top()->val);
  15. st.pop();
  16. tag.pop();
  17. }
  18. if (!st.empty()) {
  19. tag.top() = true;
  20. cur = st.top()->right;
  21. }
  22. else {
  23. break;
  24. }
  25. }
  26. return res;
  27. }
  28. };

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,205人围观)

还没有评论,来说两句吧...

相关阅读