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

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日

相关文章

  • linux 断网 扫描基本命令

    Linux 断网扫描基本命令 在 Linux 的网络配置中,由于各种原因,我们时常会出现网络连接不上的情况,这时通常需要用到断网扫描命令来查找问题。 ifconfig 命令 ifconfig 命令用来查看或配置网络接口的命令,在扫描时可以用该命令先检测网络接口是否正常。 ifconfig 运行该命令后可以查看本地的网卡配置信息,可以检查网络接口的IP地址、子…

    其他 2023年3月28日
    00
  • pl/sql执行计划查看

    以下是关于“PL/SQL执行计划查看”的完整攻略: 步骤1:开启执行计划跟踪 首先,需要开启执行计划跟踪。可以使用以下命令来开启执行计划跟踪: ALTER SESSION SET STATISTICS_LEVEL=ALL; 在上面的代码中,我们使用了ALTER SESSION语句来设置STATISTICS_LEVEL参数为ALL,以开启执行计划跟踪。 步骤2…

    other 2023年5月7日
    00
  • webapi中swagger的使用(超级简单)

    以下是WebAPI中Swagger的使用的完整攻略,包含两个示例说明: 步骤1:安装Swagger 首先,需要安装Swagger。可以使用NuGet包管理器安装Swashbuckle。以下是安装步骤: 打开Visual Studio。 在解决方案资源管理器中,右键单击项目,然后选择“管理NuGet程序包”。 在NuGet程序包管理器中,搜索“Swashbuc…

    other 2023年5月9日
    00
  • sqlserver判断null和空值

    当然,我很乐意为您提供有关“SQL Server判断NULL和空值”的完整攻略。以下是详细的步骤和两个示例: 1 判断NULL和空值 在SQL Server中,可以使用IS NULL和IS NOT NULL运算符来判断NULL值。而对于空值,可以使用空字符串”或者使用LEN函数来判断。 2 示例 以下是两个判断NULL和空值的示例: 2.1 判断NULL值…

    other 2023年5月6日
    00
  • C++返回值是类名和返回值是引用的区别及说明

    C++中,函数返回值可以是类名,也可以是引用类型。它们有些区别,在此进行详细解释和说明。 返回值是类名 当函数返回值是类名时,会调用类的无参构造函数来初始化返回值,然后将其作为函数的返回值进行返回。这个过程浅显易懂,下面通过一个示例来说明。 // 返回值是类名的示例代码 #include <iostream> using namespace st…

    other 2023年6月27日
    00
  • 分享JavaScript 中的几种继承方式

    分享JavaScript 中的几种继承方式 为什么需要继承? 在编写代码的过程中,我们不可能每一次都从零开始写。很多时候,我们需要利用现有的代码来实现新的功能,这就是继承的一个重要应用场景。 我们之所以需要继承,是因为继承可以让我们复用代码,避免重复劳动和代码冗余。当我们需要对某一种对象进行扩展时,继承就是我们的好选择。 继承的几种方式 在JavaScrip…

    other 2023年6月26日
    00
  • element表格组件实现右键菜单的功能

    要实现element表格组件的右键菜单功能,需要使用第三方插件——vue-context-menu 下面是具体步骤: 安装vue-context-menu,可以用npm或yarn进行安装 npm install vue-context-menu 在组件中引入vue-context-menu “` “` 在表格组件中绑定contextmenu事件,并阻止默…

    other 2023年6月27日
    00
  • Win10不能关机或重启的四种解决方法(总有一个适合你)

    Win10不能关机或重启的四种解决方法(总有一个适合你) 近期有不少Win10用户反映无法正常关机或重启,可能是因为系统更新等原因导致的,这给用户的正常使用带来不小的困难,下面我们就来介绍一下针对Win10不能关机或重启的四种解决方法,希望对大家有所帮助。 方法一:使用CMD强制关机或重启 1.打开CMD命令终端:WIN+R,在运行框中输入cmd,回车打开2…

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