二叉树三种遍历递归与非递归实现

前序遍历 pre-order

Recursive

void preorderTraversal(TreeNode* root, vector<int>& res) {
    if (root) {
        res.push_back(root);
        preorderTraversal(root->left);
        preorderTraversal(root->right);
    }
}

Non-Recursive

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> s;
    TreeNode* node = root;
    while (node || !s.empty()) {
        while (node) {
            res.push_back(node->val);
            s.push(node);
            node = node->left;
        }
        node = s.top();
        s.pop();
        node = node->right;
    }
    return res;
}

中序遍历 in-order

Recursive

void inorderTraversal(TreeNode* root, vector<int>& res) {
    if (root) {
        preorderTraversal(root->left);
        res.push_back(root);
        preorderTraversal(root->right);
    }
}

Non-Recursive

vector<int> inorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> s;
    TreeNode* node = root;
    while (node || !s.empty()) {
        while (node) {
            s.push(node);
            node = node->left;
        }
        node = s.top();
        s.pop();
        res.push_back(node->val);
        node = node->right;
    }
    return res;
}

后序遍历 post-order

Recursive

void postorderTraversal(TreeNode* root, vector<int>& res) {
    if (root) {
        preorderTraversal(root->left);
        preorderTraversal(root->right);
        res.push_back(root);
    }
}

Non-Recursive

vector<int> postorderTraversal(TreeNode* root) {
    vector<int> res;
    stack<TreeNode*> s;
    TreeNode* node = root;
    while (node || !s.empty()) {
        while (node) {
            res.insert(res.begin(), node->val);
            s.push(node);
            node = node->right;
        }
        node = s.top();
        s.pop();        
        node = node->left;
    }
    return res;
}

2020/4 Karl

发布了30 篇原创文章 · 获赞 7 · 访问量 4435

猜你喜欢

转载自blog.csdn.net/weixin_40005329/article/details/105263842