代码随想录13天,二叉树递归遍历 、迭代遍历、统一迭代、层序遍历

1.二叉树递归遍历,熟悉自己构造二叉树。

// 二叉树递归遍历
#include <iostream>
#include <vector>

// 定义二叉树节点结构
struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 前序遍历函数
void preorderTraversalHelper(TreeNode *root, std::vector<int> &result)
{
    if (root == nullptr)
        return;                                   // 基本情况:如果节点为空,则返回
    result.push_back(root->val);                  // 访问根节点
    preorderTraversalHelper(root->left, result);  // 递归遍历左子树
    preorderTraversalHelper(root->right, result); // 递归遍历右子树
}

// 返回前序遍历结果的函数
std::vector<int> preorderTraversal(TreeNode *root)
{
    std::vector<int> result;
    preorderTraversalHelper(root, result);
    return result;
}

// 主函数用于测试
int main()
{
    // 构建一个简单的树: 1 -> 2 -> 3
    TreeNode *root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);

    std::vector<int> traversal = preorderTraversal(root);
    for (int value : traversal)
    {
        std::cout << value << " ";
    }
    return 0;
}

2.二叉树迭代遍历,熟悉一下用栈实现迭代遍历

// 二叉树迭代遍历,用堆实现
#include <iostream>
#include <vector>
#include <stack>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 用堆来实现迭代遍历
vector<int> preorderTraversal(TreeNode *root)
{
    stack<TreeNode *> st;
    vector<int> result;
    if (root == nullptr)
        return result;
    st.push(root);

    while (!st.empty())
    {
        TreeNode *node = st.top();
        st.pop();
        result.push_back(node->val);
        if (node->right)
            st.push(node->right);
        if (node->left)
            st.push(node->left);
    }

    return result;
}

// 注意中序遍历需要注意访问顺序和处理顺序的区别,后序遍历可以通过改变前序遍历反转得到
vector<int> inorderTraversal(TreeNode *root)
{
    vector<int> result;
    stack<TreeNode *> st;
    TreeNode *cur = root;
    while (cur != NULL || !st.empty())
    {
        if (cur != NULL)
        {                    // 指针来访问节点,访问到最底层
            st.push(cur);    // 将访问的节点放进栈
            cur = cur->left; // 左
        }
        else
        {
            cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
            st.pop();
            result.push_back(cur->val); // 中
            cur = cur->right;           // 右
        }
    }
    return result;
}

int main()
{
    TreeNode *root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);

    std::vector<int> res = preorderTraversal(root);
    for (int val : res)
    {
        std::cout << val << " ";
    }
    return 0;
}

3.统一迭代,针对迭代法不能用统一的操作实现不同顺序迭代的问题,使用添加了操作标志的结构体来实现,代码如下:

// 针对迭代法实现二叉树三种遍历时不能统一风格的问题,可以加一个标志位标志操作的性质来实现
#include <iostream>
#include <stack>
#include <vector>

// 二叉树节点的定义
struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 用于标记操作的枚举类型
enum Action
{
    ADD,
    PRINT
};

// 操作的结构体,包含一个操作和一个节点
struct Command
{
    Action action;
    TreeNode *node;
};

// 三种遍历的统一函数
std::vector<int> traverse(TreeNode *root, const std::string &order)
{
    std::vector<int> result;
    if (!root)
        return result;

    std::stack<Command> stack;
    stack.push({ADD, root});

    while (!stack.empty())
    {
        Command cmd = stack.top();
        stack.pop();

        if (cmd.node == nullptr)
            continue;
        if (cmd.action == PRINT)
        {
            result.push_back(cmd.node->val);
        }
        else
        {
            if (order == "postorder")
            {
                stack.push({PRINT, cmd.node});
                stack.push({ADD, cmd.node->right});
                stack.push({ADD, cmd.node->left});
            }
            else if (order == "inorder")
            {
                stack.push({ADD, cmd.node->right});
                stack.push({PRINT, cmd.node});
                stack.push({ADD, cmd.node->left});
            }
            else
            { // preorder
                stack.push({ADD, cmd.node->right});
                stack.push({ADD, cmd.node->left});
                stack.push({PRINT, cmd.node});
            }
        }
    }
    return result;
}

int main()
{
    // 构建一个简单的二叉树
    TreeNode *root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    // 前序遍历
    std::vector<int> preorder = traverse(root, "preorder");
    std::cout << "Preorder: ";
    for (int val : preorder)
    {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    // 中序遍历
    std::vector<int> inorder = traverse(root, "inorder");
    std::cout << "Inorder: ";
    for (int val : inorder)
    {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    // 后序遍历
    std::vector<int> postorder = traverse(root, "postorder");
    std::cout << "Postorder: ";
    for (int val : postorder)
    {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}

4.比较简单的层序遍历

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

vector<int> levelOrder(TreeNode *root)
{

    vector<int> result;
    if (root == nullptr)
        return result;

    queue<TreeNode *> queue;
    queue.push(root);

    while (!queue.empty()) 
    {
        TreeNode *node = queue.front();
        queue.pop();

        result.push_back(node->val);

        if (node->left)
            queue.push(node->left);
        if (node->right)
            queue.push(node->right);
    }
    return result;
}

vector<vector<int>> levelOrder2(TreeNode *root)
{

    vector<vector<int>> result;
    queue<TreeNode *> queue;
    if (root != nullptr)
        queue.push(root);

    while (!queue.empty()) // 如果要按照层来划分的话,需要加一个for循环
    {
        int size = queue.size();
        vector<int> vec;
        for (int i = 0; i < size; i++)
        {
            TreeNode *node = queue.front();
            queue.pop();
            vec.push_back(node->val);
            if (node->left)
                queue.push(node->left);
            if (node->right)
                queue.push(node->right);
        }
        result.push_back(vec);
    }
    return result;
}

int main()
{
    // 构建一个简单的二叉树
    TreeNode *root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    // 进行层序遍历
    std::vector<int> result = levelOrder(root);
    std::cout << "Level order traversal: ";
    for (int val : result)
    {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值