C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

下面是关于C++二叉树数据结构的详细攻略。

什么是二叉树

二叉树是一种树形数据结构,每个节点最多有两个子节点:左节点和右节点。一个节点没有左节点或右节点则分别为左子树和右子树为空。

递归遍历二叉树

前序遍历

前序遍历是指对于一棵二叉树,在访问右子树之前,先访问根节点,然后访问左子树。

下面是C++递归遍历二叉树的前序遍历示例代码:

template <typename T>
void preorderTraversal(TreeNode<T>* root) {
    if (!root) return;
    cout << root->val << " ";
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}

中序遍历

中序遍历是指对于一棵二叉树,先访问其左子树,再访问根节点,最后访问右子树。

下面是C++递归遍历二叉树的中序遍历示例代码:

template <typename T>
void inorderTraversal(TreeNode<T>* root) {
    if (!root) return;
    inorderTraversal(root->left);
    cout << root->val << " ";
    inorderTraversal(root->right);
}

后序遍历

后序遍历是指对于一棵二叉树,先访问其左子树和右子树,最后访问根节点。

下面是C++递归遍历二叉树的后序遍历示例代码:

template <typename T>
void postorderTraversal(TreeNode<T>* root) {
    if (!root) return;
    postorderTraversal(root->left);
    postorderTraversal(root->right);
    cout << root->val << " ";
}

非递归遍历二叉树

递归遍历二叉树的缺点是可能由于函数调用过多导致内存溢出,而非递归遍历避免了这种问题。

前序遍历

前序遍历的非递归方法需要使用栈,将当前节点压入栈中,然后将其右子节点和左子节点分别压入栈中,这样每次弹出栈顶节点时就是先访问其左子节点,然后访问右子节点。

下面是C++非递归遍历二叉树的前序遍历示例代码:

template <typename T>
void preorderTraversal2(TreeNode<T>* root) {
    if (!root) return;
    stack<TreeNode<T>*> s;
    s.push(root);
    while (!s.empty()) {
        auto node = s.top();
        s.pop();
        cout << node->val << " ";
        if (node->right) s.push(node->right);
        if (node->left) s.push(node->left);
    }
}

中序遍历

中序遍历的非递归方法也需要使用栈,将根节点和其左子节点一直压入栈中,直至最左边的叶子节点;然后弹出当前节点并访问,再将当前节点的右子节点压入栈中,继续执行上述过程。

下面是C++非递归遍历二叉树的中序遍历示例代码:

template <typename T>
void inorderTraversal2(TreeNode<T>* root) {
    if (!root) return;
    stack<TreeNode<T>*> s;
    auto node = root;
    while (node || !s.empty()) {
        while (node) {
            s.push(node);
            node = node->left;
        }
        node = s.top();
        s.pop();
        cout << node->val << " ";
        node = node->right;
    }
}

后序遍历

后序遍历的非递归方法较为复杂,需要使用两个栈,其中一个栈用来保存经过中右左遍历的结果,另一个栈则用来保存中右左遍历的顺序。

下面是C++非递归遍历二叉树的后序遍历示例代码:

template <typename T>
void postorderTraversal2(TreeNode<T>* root) {
    if (!root) return;
    stack<TreeNode<T>*> s1, s2;
    s1.push(root);
    while (!s1.empty()) {
        auto node = s1.top();
        s1.pop();
        s2.push(node);
        if (node->left) s1.push(node->left);
        if (node->right) s1.push(node->right);
    }
    while (!s2.empty()) {
        auto node = s2.top();
        s2.pop();
        cout << node->val << " ";
    }
}

以上就是C++二叉树数据结构的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • MySQL索引结构详细解析

    MySQL索引结构是MySQL数据库中非常重要的一部分,它能够显著提升数据库查询效率。本文将详细解析MySQL索引结构,包括索引的基本概念、常见的索引类型、索引的创建、索引的使用和索引的优化等方面。 索引的基本概念 索引是一种数据结构,它可以加速数据库中的查询操作。索引一般是在表中一个或多个列上创建的,这些列的值被按照一定的规则存储在索引中。当查询时,可以通…

    数据结构 2023年5月17日
    00
  • C++实现KDTree 附完整代码

    对于“C++实现KDTree 附完整代码”的攻略,我会分为以下几个部分进行讲解: KDTree的基本概念和算法原理 KDTree的实现思路和整体代码结构 KDTree在实际应用中的应用场景 两个示例应用说明 KDTree基本概念和算法原理 KDTree全称是K-Dimensional Tree,即K维树,是一种便于高维空间数据检索的数据结构。其基本思路是对于…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十三天–数据库(3)

    当我们准备面试数据库相关的职位时,需要掌握SQL语言和常见的数据库管理系统。下面是针对Java面试中可能出现的常见数据库面试题的一些攻略。 1. 数据库连接的常见方式 在Java中,要与数据库连接有两种方式:JDBC和ORM框架。 (1) JDBC JDBC是Java连接数据库的标准方式,使用JDBC可以通过Java程序来连接不同的数据库。连接数据库的步骤包…

    数据结构 2023年5月17日
    00
  • C++二叉树结构的建立与基本操作

    C++二叉树是一种非常常见的数据结构,同时也是算法中经常使用的一种数据结构。本文将详细讲解C++二叉树的建立和基本操作,包括二叉树的定义、创建、遍历和删除等。 1. 二叉树的定义 二叉树是一种树形结构,每个节点最多只有两个子节点:左子节点和右子节点。树的深度取决于有多少个节点,根节点是最顶端的节点,不再有父节点。节点之间存在一些有天然排序关系且有先后性的关系…

    数据结构 2023年5月17日
    00
  • Java数据结构之简单链表的定义与实现方法示例

    Java数据结构之简单链表的定义与实现方法示例 什么是链表 链表是线性数据结构的一种,它是由一个个节点构成的,每个节点包含两个部分,一个是数据,另一个是指向下一个节点的引用,通俗的说,就像火车一样,每节火车都是一个节点,而每车头都指向下一节车厢。 链表的定义 Java中常用链表有单向链表和双向链表,单向链表每个节点只有一个指向下一个节点的引用,而双向链表每个…

    数据结构 2023年5月17日
    00
  • 0-学习路线

    超详细的算法学习路线 https://cuijiahua.com/blog/2020/10/life-73.html   主要分为 4 个部分:数学基础、编程能力、算法基础、实战。 1、数学基础 在机器学习算法中,涉及到最为重要的数学基本知识有两个:线性代数和概率论。 这两也是大学的必修课了,如果知识早已还给老师,也没关系,哪里不会学补哪里。 线性代数研究的…

    算法与数据结构 2023年4月17日
    00
  • 详解Pytorch中的tensor数据结构

    详解Pytorch中的Tensor数据结构 在Pytorch中,Tensor是一种重要的数据结构,它是一个多维数组(类似于NumPy的ndarray),并且支持GPU加速操作。在本文中,我们将详细介绍Pytorch中的Tensor数据结构,包括如何创建、初始化、检索和修改Tensor对象。 创建Tensor对象 创建Tensor对象的方法有很多种。以下是一些…

    数据结构 2023年5月17日
    00
  • Java 超详细讲解数据结构的应用

    Java 超详细讲解数据结构的应用 简介 “Java 超详细讲解数据结构的应用”是一个基于Java语言的数据结构教程,其中包含了各种数据结构的理论知识和实际应用,在学习过程中可以帮助初学者更好地理解数据结构的本质和实际应用场景。 学习路径 数据结构理论 在本教程中,我们首先介绍了数据结构的几种基本分类和常用的数据结构,包括数组、链表、栈、队列、堆、树、图等等…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部