二叉树,先序中序后序,非递归通用模板

223 阅读1分钟

只要调整代码的[10,13]这4行的顺序就可以切换先序,中序,后序了

1.先序遍历

vector<int> preorderTraversal(TreeNode* root) {
    if(root==nullptr)return {};
    vector<int> res;		//返回答案的数组
    stack<TreeNode*> stk;
    stk.push(root);
    while(!stk.empty()){
        TreeNode *cur=stk.top();
        stk.pop();
        if(cur!=nullptr){//先序遍历访问顺序:根节点-》左子树-》右子树    压栈顺序:右子树-》左子树-》根节点
            if(cur->right)stk.push(cur->right); //10 因为栈先进后出,右子树最后访问,所以先压进去
            if(cur->left)stk.push(cur->left);   //11 接着压左子树
            stk.push(cur);                      //12 然后才压根节点
            stk.push(nullptr);                  //13 值为空指针的节点作用是标记
        }else{//遇到值为空指针的节点,压在空指针下面的节点加入res数组
            TreeNode *temp=stk.top();			 
            stk.pop();
            res.push_back(temp->val);
        }
    }
    return res;
}

2.中序遍历

vector<int> inorderTraversal(TreeNode* root) {
    if(root==nullptr)return {};
    vector<int> res;
    stack<TreeNode*> stk;
    stk.push(root);
    while(!stk.empty()){
        TreeNode *cur=stk.top();
        stk.pop();
        if(cur!=nullptr){					
            if(cur->right)stk.push(cur->right);//10
            stk.push(cur);                     //11
            stk.push(nullptr);                 //12
            if(cur->left)stk.push(cur->left);  //13
        }else{
            TreeNode *temp=stk.top();
            stk.pop();
            res.push_back(temp->val);
        }
    }
    return res;
}

扩展:二叉搜索树的中序遍历是一个递增数组,有些算法题会用到这个性质

3.后序遍历

Cvector<int> postorderTraversal(TreeNode* root) {
    if(root==nullptr)return {};
    vector<int> res;
    stack<TreeNode*> stk;
    stk.push(root);
    while(!stk.empty()){
        TreeNode *cur=stk.top();
        stk.pop();
        if(cur!=nullptr){
            stk.push(cur);                     //10
            stk.push(nullptr);                 //11
            if(cur->right)stk.push(cur->right);//12
            if(cur->left)stk.push(cur->left);  //13
        }else{
            TreeNode *temp=stk.top();
            stk.pop();
            res.push_back(temp->val);
        }
    }
    return res;
}