C++非递归建立二叉树实例

yizhihongxing

C++非递归建立二叉树实例的攻略如下:

步骤一:定义二叉树的结构体

首先,我们需要定义一个二叉树的结构体。在这个结构体中,我们需要定义每个节点的值、左右子树指针。

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;

    // 构造函数
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

步骤二:非递归地建立二叉树

我们可以借助栈来非递归地建立二叉树。具体步骤如下:

  1. 创建一个栈,用于存储节点指针。
  2. 以先序遍历的方式读入二叉树的节点值,在读入一个节点值后,创建一个新节点,并将该节点入栈。
  3. 一旦遇到空节点,则从栈中弹出栈顶节点(它一定是最后一个非空节点的右子节点),然后继续读入节点值,并创建新节点。
  4. 循环执行步骤2和步骤3,直到所有节点都被读入并入栈。

下面是一个示例,演示如何使用非递归的方式构建下面这个二叉树。

       1
      / \
     2   3
    / \
   4   5
// 根据先序遍历的序列创建一棵二叉树
TreeNode* createBinaryTree(vector<int>& preorder) {
    if (preorder.empty()) {
        return NULL;
    }

    stack<TreeNode*> s;
    TreeNode* root = new TreeNode(preorder[0]);
    TreeNode* p = root;

    for (int i = 1; i < preorder.size(); ++i) {
        if (preorder[i] < p->val) {
            p->left = new TreeNode(preorder[i]);
            s.push(p);
            p = p->left;
        } else {
            while (!s.empty() && s.top()->val < preorder[i]) {
                p = s.top();
                s.pop();
            }
            p->right = new TreeNode(preorder[i]);
            p = p->right;
        }
    }

    return root;
}

步骤三:遍历二叉树

最后,我们可以通过递归方式或非递归方式遍历二叉树。这里提供一个用非递归方式实现的中序遍历的示例。

vector<int> inorderTraversal(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> s;
    TreeNode* p = root;

    while (p != NULL || !s.empty()) {
        while (p != NULL) {
            s.push(p);
            p = p->left;
        }
        p = s.top();
        s.pop();
        result.push_back(p->val);
        p = p->right;
    }

    return result;
}

总结:通过以上步骤,我们就完成了用非递归的方式建立二叉树并进行遍历的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++非递归建立二叉树实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • ehcart设置雷达图尺寸

    以下是ECharts设置雷达图尺寸的完整攻略: ECharts设置雷达图尺寸 ECharts是一款开源的JavaScript图表库,可以用于创建各种类型的交互式图表。以下是设置雷达图尺寸的步骤: 创建雷达图。 在ECharts中,您可以使用radar组件创建雷达图。以下是一个基本的雷达图示例: javascript option = { radar: { i…

    other 2023年5月7日
    00
  • DHCP不能分配IP地址怎么办

    DHCP不能分配IP地址的解决攻略 1. 检查网络连接 首先,确保网络连接正常。检查以下几个方面: 确认网络电缆是否连接到正确的端口。 检查路由器或交换机的状态灯,确保它们正常工作。 尝试连接其他设备,如手机或平板电脑,以确定是否存在网络问题。 如果网络连接正常,但DHCP仍然无法分配IP地址,请继续以下步骤。 2. 检查DHCP服务器设置 DHCP服务器可…

    other 2023年7月30日
    00
  • esri和arcgis

    Esri和ArcGIS Esri是一家致力于地理信息系统(GIS)技术和数据的研发、生产和销售的公司,而ArcGIS则是他们所生产的GIS软件平台。本文将对Esri和ArcGIS进行简单的介绍和评价。 Esri概述 Esri成立于1969年,总部位于美国加州的雷迪兰兹,是全球GIS技术领域的领导厂商之一,为全球超过350,000个组织和机构提供各种GIS软件…

    其他 2023年3月29日
    00
  • verilog语言设计三段式状态机

    Verilog语言设计三段式状态机 在Verilog语言中,状态机是一种常见的设计模式,用于描述系统的状态和状态之间的转换。三段式状态机是一种常见的状态机设计模式,它将状态机分为三个部分:状态寄存器、组合逻辑和输出寄存器。本文将对三段式状态机进行详细的分析,并提供两个示例说明。 三段式状态机的组成部分 三段式状态机由三个部分组成:状态寄存器、组合逻辑和输出寄…

    other 2023年5月9日
    00
  • 这些开源的oa协同办公系统 真的免费又好用!

    这些开源的OA协同办公系统真的免费又好用! 随着互联网的发展,越来越多的企业开始使用OA协同办公系统来提高工作效率和管理效率。而开源的OA同办公系统不仅免费,且强大,可以满足大部分企业的需求。本文将介绍几款开源的OA同办公系统,并提供两示例说明以帮助您更好地了解和应用这些系统。 1. 开源OA 开OA是一款基于Web的OA协同办系统,支持多语言、多平台、多数…

    other 2023年5月7日
    00
  • docker开启mysql的binlog日志解决数据卷问题

    以下是关于如何在Docker中开启MySQL的binlog日志以解决数据卷问题的完整攻略,包含两个示例说明: 1. 配置MySQL容器 首先,创建一个MySQL容器并配置binlog日志的相关参数。可以使用以下命令创建容器: docker run -d –name mysql-container \\ -e MYSQL_ROOT_PASSWORD=your…

    other 2023年10月19日
    00
  • React项目中decorators装饰器报错问题解决方案

    React项目中使用decorators装饰器时,常常会出现”Decorators are not supported at the language”的报错信息。这是因为在默认情况下,React并不支持ES7的decorators语法。本文将讲解解决decorators报错的方法。 什么是decorators装饰器 decorators装饰器是ES7中引入…

    other 2023年6月27日
    00
  • 制作传奇技术系列之一架设技术

    制作传奇技术系列之一架设技术的完整攻略如下: 一、准备工作 服务器选择 首先需要选择一台可靠的服务器,建议选择配置较高的云服务器,例如阿里云、腾讯云等。 操作系统安装 选择合适的操作系统,建议选择Linux操作系统,因为Linux操作系统对于服务器来说更加稳定、安全。 环境搭建 在Linux操作系统上安装好基本的软件包、编译器等软件,然后安装相应的Web服务…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部