您的位置:首页 > 其它

二叉树的前序、中序、后序遍历(递归与非递归)

2017-03-31 13:55 423 查看
本文主要总结二叉树的前序、中序、后序遍历,分为递归和非递归

(1)前序遍历:根→左→右

(2)中序遍历:左→根→右

(3)后序遍历:左→右→根

 

首先定义一个二叉树:

struct BiTree 

{  

   char val;  

    BiTree *lchild;  

    BiTree *rchild;  

};  

1.递归的方法

(1)前序遍历(根→左→右)

void PreOrderTraverse(BiTree*
root)  

{  

    if (root!=NULL)  

    {  

        cout<<root->val;

        PreOrderTraverse(root->lchild);  

        PreOrderTraverse(root->rchild);  

    }     

}  

(2)中序遍历(左→根→右)

void InOrderTraverse(BiTree*
root)  

{  

    if (root!=NULL)  

    {  

        InOrderTraverse(root->lchild);  

        cout<<root->val;

        InOrderTraverse(root->rchild);   

    }     

}  

(3)后序遍历(左→右→根)

void PostOrderTraverse(BiTree*
root)  

{  

    if (root!=NULL)  

    {  

        PostOrderTraverse(root->lchild);  

        PostOrderTraverse(root->rchild);   

        cout<<root->val;

    }     

}  

2.非递归遍历:用到了栈

(1)前序

vector<int> preorderTraversal(TreeNode* root) {  

    vector<int> res;  

    std::stack<TreeNode*> temp;  

    while (root || !temp.empty()) {  

        while (root) {  

            temp.push(root);  

            res.push_back(root->val);  

            root = root->left;  

        }  

        root = temp.top();  

        temp.pop();  

        root = root->right;  

    }  

    return res;  

}  

(2)中序

vector<int> inorderTraversal(TreeNode* root) {  

    vector<int> res;  

    std::stack<TreeNode*> temp;  

    while (root || !temp.empty()) {  

        while (root) {  

            temp.push(root);  

            root = root->left;  

        }  

        root = temp.top();  

        temp.pop();  

        res.push_back(root->val);  

        root = root->right;  

    }  

    return res;  

}  

(3)后序

vector<int> postorderTraversal(TreeNode* root) {  

    vector<int> res;  

    std::stack<TreeNode*> temp;  

    while (root || !temp.empty()) {  

        while (root) {  

            temp.push(root);  

            res.insert(res.begin(),root->val);  

            root = root->right;  

        }  

        root = temp.top();  

        temp.pop();  

        root = root->left;  

    }  

    return res;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐