117.info
人生若只如初见

c++二叉树怎么建立与遍历

建立二叉树: 可以使用递归或者迭代的方式来建立二叉树。

递归方式建立二叉树:

  1. 创建一个二叉树节点结构,包含一个值和指向左右子节点的指针。
  2. 使用递归的方式,先建立左子树,再建立右子树。
  3. 根据具体需求,确定递归的终止条件。

示例代码如下:

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

TreeNode* buildTree(vector<int>& nums, int start, int end) {
    if (start > end) {
        return nullptr;
    }
    
    int mid = start + (end - start) / 2;
    TreeNode* root = new TreeNode(nums[mid]);
    root->left = buildTree(nums, start, mid - 1);
    root->right = buildTree(nums, mid + 1, end);
    
    return root;
}

TreeNode* buildBinaryTree(vector<int>& nums) {
    return buildTree(nums, 0, nums.size() - 1);
}

迭代方式建立二叉树:

  1. 创建一个二叉树节点结构,包含一个值和指向左右子节点的指针。
  2. 使用一个队列来辅助建立二叉树。从根节点开始,依次将左右子节点入队列。
  3. 根据具体需求,确定迭代的终止条件。

示例代码如下:

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

TreeNode* buildBinaryTree(vector<int>& nums) {
    if (nums.empty()) {
        return nullptr;
    }
    
    TreeNode* root = new TreeNode(nums[0]);
    queue q;
    q.push(root);
    
    int i = 1;
    while (i < nums.size()) {
        TreeNode* node = q.front();
        q.pop();
        
        if (i < nums.size() && nums[i] != -1) {
            node->left = new TreeNode(nums[i]);
            q.push(node->left);
        }
        
        i++;
        
        if (i < nums.size() && nums[i] != -1) {
            node->right = new TreeNode(nums[i]);
            q.push(node->right);
        }
        
        i++;
    }
    
    return root;
}

遍历二叉树: 常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。

前序遍历(根左右):

  1. 访问根节点。
  2. 递归地前序遍历左子树。
  3. 递归地前序遍历右子树。

示例代码如下:

void preorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    
    // 访问根节点
    cout << root->val << " ";
    
    // 前序遍历左子树
    preorderTraversal(root->left);
    
    // 前序遍历右子树
    preorderTraversal(root->right);
}

中序遍历(左根右):

  1. 递归地中序遍历左子树。
  2. 访问根节点。
  3. 递归地中序遍历右子树。

示例代码如下:

void inorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    
    // 中序遍历左子树
    inorderTraversal(root->left);
    
    // 访问根节点
    cout << root->val << " ";
    
    // 中序遍历右子树
    inorderTraversal(root->right);
}

后序遍历(左右根):

  1. 递归地后序遍历左子树。
  2. 递归地后序遍历右子树。
  3. 访问根节点。

示例代码如下:

void postorderTraversal(TreeNode* root) {
    if (root == nullptr) {
        return;

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe848AzsLAwBVA10.html

推荐文章

  • c# winform组件 怎样集成

    在C# WinForms应用程序中集成组件通常涉及以下几个步骤: 添加引用: 首先,确保你已经安装了所需的组件。例如,如果你想要集成一个第三方库,你需要将该库的DLL...

  • c# winform组件 怎样提高效率

    要提高C# WinForms应用程序的效率,可以从多个方面入手,包括优化绘图过程、使用异步操作、合理设置控件属性等。以下是一些具体的优化策略:
    优化绘图过程 ...

  • c# winform组件 怎样自定义

    在C#中,要自定义WinForms组件,您需要创建一个继承自现有控件的新类,并重写其构造函数、事件处理程序和其他相关方法。以下是一个简单的示例,说明如何创建一个...

  • c# winform组件 怎样选择合适

    在C# WinForms应用程序开发中,选择合适的组件对于构建高效、用户友好的界面至关重要。以下是一些选择合适组件的建议:
    控件选择 根据需求选择:选择控件时...

  • win10网页加载不出来的原因有哪些

    Win10网页加载不出来的原因可能有以下几种: 网络连接问题:可能是因为网络连接不稳定或者网络设置的问题,导致无法正常加载网页。
    DNS解析问题:可能是因为...

  • win10分辨率调整不了如何解决

    如果无法调整Windows 10的分辨率,可以尝试以下几种解决方法: 更新显卡驱动程序:前往电脑制造商或显卡制造商的官方网站下载最新的显卡驱动程序,并安装更新。 ...

  • linux中的awk命令有哪些功能

    awk命令在Linux中具有以下功能: 模式匹配和处理:awk命令可以根据指定的模式来匹配文本文件中的行,并对匹配到的行进行处理。 字段分割和提取:awk命令可以将每...

  • Java的StringBuffer有什么作用

    Java的StringBuffer是用来处理字符串的可变的序列。它可以用于拼接字符串、插入字符串、替换字符串等操作。
    StringBuffer可以实现字符串的追加,即在已有字...