LeetCode 二叉树的四种遍历:前序、中序、后序、层序(C++)

1.前序遍历

前序遍历:先遍历根节点,再遍历左子树,最后遍历右子树(根-左-右)

1.1 基于递归实现

class Solution {
public:
    vector<int> res;

    vector<int> preorderTraversal(TreeNode* root) {

        if (root == nullptr) return res;

        res.push_back(root->val);
        preorderTraversal(root->left);
        preorderTraversal(root->right);

        return res;
    }
};

1.2 基于迭代实现

 由于没有指向父节点的指针,所以需要辅助栈来记录路径中的右子节点。

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        
        vector<int> res;
        stack<TreeNode*> stack;  //辅助栈
        stack.push(root);

        while (!stack.empty())
        {
            TreeNode* pNode = stack.top(); stack.pop();
            if (pNode == nullptr) continue;
            res.push_back(pNode->val);  //先访问当前节点

            stack.push(pNode->right);  //先存入右子节点
            stack.push(pNode->left);  //后存入左子节点
        }
        return res;
    }
};
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {

        vector<int> res;
        stack<TreeNode*> stack;  //辅助栈

        while (true)
        {
            if (root != nullptr)  //寻找最左节点
            {
                res.push_back(root->val);  //访问中途节点
                stack.push(root->right);  //暂存右子节点
                root = root->left;
            }
            else if (!stack.empty())  //找到最左节点后
            {
                root = stack.top(); stack.pop();
            }
            else
                break;
        }
        return res;
    }
};

2.中序遍历

中序遍历:先遍历左子树,再遍历根节点,最后遍历右子树(左-根-右)

2.1 基于递归实现

2.2 基于迭代实现

3. 后序遍历

后序遍历:先遍历左子树,再遍历右子树,最后遍历根节点(左-右-根)

3.1 基于递归实现

3.2 基于迭代实现

4. 层次遍历

代码与图参考:

[1] LeetCode 题库.

[2] 数据结构(C++语言版), 邓俊辉, 2010.

猜你喜欢

转载自www.cnblogs.com/ZSY-blog/p/13355909.html