二叉树的前序中序后序遍历

一、前序遍历

144. Binary Tree Preorder Traversal

递归代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> preOrder;
        doPreOrderTraversal(root,preOrder);
        return preOrder;
    }
    void doPreOrderTraversal(TreeNode* root,vector<int> &preOrder){
        if(root){
            preOrder.push_back(root->val);
            doPreOrderTraversal(root->left,preOrder);
            doPreOrderTraversal(root->right,preOrder);
        }
    }
};

迭代法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> S;
        TreeNode *p = root;
        while( p!=nullptr || !S.empty()){
            if(p){
                res.push_back(p->val);
                S.push(p);
                p = p->left;
            }else{
                p = S.top();
                S.pop();
                p = p->right;
            }
        }
        return res;
    }
};

二、中序遍历

94. Binary Tree Inorder Traversal

递归代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> inOrder;
        doInorderTraversal(root,inOrder);
        return inOrder;
    }
    void doInorderTraversal(TreeNode* root,vector<int> &inOrder){
        if(root){
            doInorderTraversal(root->left,inOrder);
            inOrder.push_back(root->val);
            doInorderTraversal(root->right,inOrder);
        }
    }
};

迭代法:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> S;
        TreeNode *p = root;
        while(p!=nullptr || !S.empty()){
            if(p){
                S.push(p);
                p = p->left;
            }else{
                p = S.top();
                res.push_back(p->val);
                S.pop();
                p = p->right;
            }
        }
        return res;
    }
};

三、后续遍历

145. Binary Tree Postorder Traversal

递归代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> postOrder;
        doPostOrderTraversal(root,postOrder);
        return postOrder;
    }
    void doPostOrderTraversal(TreeNode* root,vector<int> &postOrder){
        if(root){
            doPostOrderTraversal(root->left,postOrder);
            doPostOrderTraversal(root->right,postOrder);
            postOrder.push_back(root->val);
        }
    }
};

迭代法:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> S;
        TreeNode* p = root;
        TreeNode* visited_right = nullptr;
        while(p!=nullptr || !S.empty()){
            if(p){
                S.push(p);
                p = p->left;
            }else{
                p = S.top();
                if(p->right != nullptr && p->right != visited_right){
                    //转向右子树
                    p = p->right;
                }else{
                    res.push_back(p->val);
                    S.pop();
                    visited_right = p;//记录最近已经取值过的结点
                    p = nullptr;//以p为根的子树已经遍历完,必须重置p指针
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值