当前位置: 首页 > article >正文

⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C++实现)Binary Tree Preorder Traversal

⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C++实现)Binary Tree Inorder Traversal
Given the root of a binary tree, return the preorder traversal of its nodes’ values.

Example 1:

Input: root = [1,null,2,3]
Output: [1,2,3]

Explanation:
在这里插入图片描述

Example 2:

Input: root = [1,2,3,4,5,null,8,null,null,6,7,9]
Output: [1,2,4,5,6,7,3,8,9]

Explanation:
在这里插入图片描述
Example 3:

Input: root = []
Output: []

Example 4:

Input: root = [1]
Output: [1]
// 定义二叉树节点结构
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

递归解法

  • 前序遍历的顺序是: 根节点 → 左子树 → 右子树 根节点 \rightarrow 左子树 \rightarrow 右子树 根节点左子树右子树
  • 使用递归实现。
#include <vector>
using namespace std;

// 递归前序遍历函数
void preorderTraversalHelper(TreeNode* root, vector<int>& result) {
    if (root == NULL) {
        return;
    }
    // 访问根节点
    result.push_back(root->val);
    // 递归遍历左子树
    preorderTraversalHelper(root->left, result);
    // 递归遍历右子树
    preorderTraversalHelper(root->right, result);
}

// 前序遍历主函数
vector<int> preorderTraversal(TreeNode* root) {
    vector<int> result;
    preorderTraversalHelper(root, result);
    return result;
}

迭代解法(使用栈)

使用 来模拟递归过程。以下是迭代方法的实现:

#include <vector>
#include <stack>
using namespace std;

// 迭代前序遍历函数
vector<int> preorderTraversal(TreeNode* root) {
    vector<int> result;
    if (root == NULL) {
        return result;
    }

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

    while (!stack.empty()) {
        TreeNode* node = stack.top();
        stack.pop();
        result.push_back(node->val);

        // 先将右子节点压栈,再压左子节点
        if (node->right != NULL) {
            stack.push(node->right);
        }
        if (node->left != NULL) {
            stack.push(node->left);
        }
    }

    return result;
}

http://www.kler.cn/a/594681.html

相关文章:

  • 使用matlab求伴随矩阵
  • sqli-labs学习笔记2
  • 在K8S中挂载 Secret 到 Pod
  • Android14 Log.isLoggable判断的分析
  • 《线程池最终版:使用可变参模板和future优化重构设计》
  • 【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint
  • JVM逃逸分析作用和原理
  • 大语言模型的训练数据清洗策略
  • Spring MVC 接口数据
  • 绿盟科技春招面试
  • 解决 FFmpeg 处理 H.264 视频时因分辨率对齐导致的崩溃问题
  • 20250320在荣品的PRO-RK3566开发板的buildroot系统下使用J27口的OTG0口接鼠标
  • AI+视频赋能智慧农业:EasyCVR打造全域可视化农场监管平台
  • Xcode16.1使用MonkeyDev运行Tiktok报错分析
  • Git(12)GitLab持续集成(CICD)
  • 在Qt中保存QComboBox变化前的值
  • 持续集成(CI)/持续部署(CD)
  • 【Unity Bug 随记】使用Rider debug功能时Unity Reload Domain卡死问题
  • sql-DDL
  • UDP协议原理