二叉树的中序遍历 leetcode

解题思路

二叉树的中序遍历

  1. 前中后序遍历可以通用的标记法 非递归方式
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        if(!root)  return {};
    vector<int> res;
    std::stack<TreeNode*> st;
    st.push(root);
   //考虑使用标记法  node null 
   while(!st.empty())
   {
       auto node= st.top();
       st.pop();
       if(node !=NULL)
       {
           
           if(node->right) st.push(node->right);
           st.push(node);
           st.push(NULL);
           if(node->left) st.push(node->left);
       }else
       {
           auto curNode= st.top();
           st.pop();
           res.push_back(curNode->val);
        
       }
   }
   return res;
    }
};

  1. 中序遍历特有的非递归方式

代码

 
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
       //一直左边到底 再返回的思路
    TreeNode  * node= root;
    std::stack<TreeNode*> st;
    std::vector<int> res;
     while(node || !st.empty())
     {
        while(node)
        {
            st.push(node);
            node= node->left;
        }
        node= st.top();
        st.pop();
        res.push_back(node->val);
         node= node->right;
         
     }
     
     return res;

        
    }
};
posted @ 2021-02-07 13:01  boyang987  阅读(62)  评论(0编辑  收藏  举报