前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉树的后序遍历

二叉树的后序遍历

作者头像
大忽悠爱学习
发布2021-11-15 10:20:02
2240
发布2021-11-15 10:20:02
举报
文章被收录于专栏:c++与qt学习

解法1:逆置法

代码语言:javascript
复制
 class Solution {
 public:
     vector<int> postorderTraversal(TreeNode* root) 
     {
         stack<TreeNode*> s;
         vector<int> ret;
         if (root == NULL)
             return ret;
         while (!s.empty() || root)
         {
             while (root)
             {
                 ret.push_back(root->val);
                 s.emplace(root);
                 root = root->right;
             }
             root = s.top();
             s.pop();
             root = root->left;
         }
         reverse(ret.begin(), ret.end());
         return ret;
     }
 };

法2:先序遍历的正统迭代写法

代码语言:javascript
复制
 class Solution {
 public:
     vector<int> postorderTraversal(TreeNode* root) 
     {
         stack<TreeNode*> s;
         vector<int> ret;
         TreeNode* prev = NULL;
         if (root == NULL)
             return ret;
         while (!s.empty() || root)
         {
             //将当前根节点压入栈中
             while (root)
             {
                 s.emplace(root);
                 root = root->left;
             }
             root = s.top();
             //如果当前根节点的右子树为空,那么当前树的后序结构为左根
             if (root->right == NULL || root->right == prev)//防止右子树被重复遍历
             {
                 s.pop();
                 ret.push_back(root->val);
                 prev = root;
                 root = NULL;
             }
             else
             {
                 //说明右子树不为空,要对右子树进行遍历
                 root = root->right;
             }


         }
         return ret;
     }
 };

解法3:递归法

代码语言:javascript
复制
 class Solution {
 public:
     vector<int> postorderTraversal(TreeNode* root) 
     {
         vector<int> ret;
           DFS(ret,root);
         return ret;
     }
     void DFS(vector<int>& ret,TreeNode* root)
     {
        if(!root)
        return ;
        DFS(ret,root->left);
        DFS(ret,root->right);
        ret.push_back(root->val);
     }
 };

解法4:颜色标记法

代码语言:javascript
复制
 class Solution {
 public:
     vector<int> postorderTraversal(TreeNode* root)
     {
         vector<int> ret;
         stack<pair<string, TreeNode*>> s;
         if (root == NULL)
             return ret;
         s.push({"white",root});
         while (!s.empty())
         {
             pair<string,TreeNode*> temp=s.top();
             s.pop();
             if (temp.second == NULL)
                 continue;
             if (temp.first == "white")
             {
                 if (temp.second->right == NULL && temp.second->left == NULL)
                 {
                     s.push({ "grey",temp.second });
                 }
                 else
                 {
                     temp.first = "grey";
                     s.push(temp);
                     s.push({ "white", temp.second->right });
                     s.push({ "white", temp.second->left });
                 }
             }
             else
             {
                 ret.push_back(temp.second->val);
             }
         }
         return ret;
     }
 };

颜色标记法解释看中序遍历中的颜色标记解法 总结: 迭代遍历的模板

代码语言:javascript
复制
while( 栈非空 || p 非空)
{
if( p 非空)
{

}
else
{

}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档