首页 > 其他 > 详细

基于栈的书的遍历

时间:2020-03-15 23:49:09      阅读:92      评论:0      收藏:0      [点我收藏+]

基于栈的先序、中序、后序遍历

void InOrderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    stack<TreeNode*> st;
    while (!st.empty() || root) {
        if (root) {
            st.push(root);
            root = root->left;
        }
        else {
            root = st.top();
            st.pop();
            cout << root->data << endl;
            root = root->right;
        }
    }
}
void PreOrderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    stack<TreeNode*> st;
    while (!st.empty() || root) {
        if (root) {
            cout << root->data << endl;
            st.push(root);
            root = root->left;
        }
        else {
            root = st.top();
            st.pop();
            root = root->right;
        }
    }
}

/*
很明显需要使用栈来进行迭代。后续遍历是依序访问左子树,右子树,根节点。我们的入口是根节点,那么我们的栈应该先保存根,然后右子树,再保存左子树。

分开来看,根的左孩子有可能是根而不是叶子结点,我们需要一路向下保存根节点,直到遇到叶子结点,才能保证根最先保存。

怎么样保证右子树比左子树先保存呢?事实上我们访问的顺序是先左后右。现在我们只需要保证右子树比根节点优先输出(后入栈),而左子树已全部出栈就可以。怎么判断什么时候入栈(第一次遇到根(左孩子),第一次遇到右孩子),什么时候出栈(第二次遇到右孩子,第二次遇到根(左孩子))?我们需要有一个pre变量来记录之前遇到的最后一个节点。如果pre和当前节点的右孩子值相等,那么我们是第二次遇到根,此时右孩子早已访问,直接根出栈。否则,我们应访访问当前节点的右孩子(入栈)。
*/
class Solution {
public:
? ? vector<int> postorderTraversal(TreeNode *root) {
? ? ? ? stack<TreeNode*> s;
? ? ? ? vector<int> result;
? ? ? ? while(root)
? ? ? ? {
? ? ? ? ? ? s.push(root);
? ? ? ? ? ? root = root->left;
? ? ? ? }
? ? ? ? ?while(!s.empty())
? ? ? ? ?{
? ? ? ? ? ? TreeNode* tmp = s.top();
? ? ? ? ? ? if(tmp->right)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(result.empty()||tmp->right->val !=result[result.size()-1])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? TreeNode* tmproot = tmp->right;
? ? ? ? ? ? ? ? ? ? while(tmproot)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? s.push(tmproot);
? ? ? ? ? ? ? ? ? ? ? ? tmproot = tmproot->left;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? result.push_back(tmp->val);
? ? ? ? ? ? ? ? ? ? s.pop();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? ?else
? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? result.push_back(tmp->val);
? ? ? ? ? ? ? ? s.pop();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result;
? ? }
};

参考链接:

  1. 二叉树的后序遍历(栈)

基于栈的书的遍历

原文:https://www.cnblogs.com/ziyuemeng/p/12500941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!