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日

相关文章

  • C#数据结构之单链表(LinkList)实例详解

    C#数据结构之单链表(LinkList)实例详解 概述 单链表是一种简单的数据结构,它由一些节点组成,每个节点包含着一个数据元素和一个指向下一个节点的指针。它的特点是可以快速的插入和删除节点,但在查找元素时效率不高。本篇文章将详细讲解单链表的实现过程和相关细节。 实现步骤 定义节点类 首先需要定义一个单链表节点类,包含两个部分:数据和指向下一个节点的指针。代…

    数据结构 2023年5月17日
    00
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现 本文将详细讲解AC自动机算法在Java中的实现方法和原理,同时提供两个示例进行说明,使读者能够深入了解该算法并学会如何使用。 什么是AC自动机算法 AC自动机(Aho-Corasick Automaton)是多模式匹配的一种经典算法,其基本思路是将多个模式串构建成一颗“字典树”,然后对输入的文本串进行扫描匹配。相比于简…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • 2021年最新Redis面试题汇总(1)

    下面我将为您详细讲解“2021年最新Redis面试题汇总(1)”的完整攻略。 1. Redis概述 首先,我们需要了解Redis是什么,以及它的特点和应用场景。 1.1 什么是Redis Redis是一种内存中的数据结构存储,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,并提供了丰富的功能,如事务、持久化、Lua…

    数据结构 2023年5月17日
    00
  • 一文带你走进js数据类型与数据结构的世界

    一文带你走进JS数据类型与数据结构的世界 一、JS数据类型 1. 原始类型 JS中原始类型包括:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。 其中Undefined和Null分别代表未定义和空值,Boolean表示布尔值,Number表示数字,String表示字符串,Symbol是ES6新增的一种基础…

    数据结构 2023年5月17日
    00
  • C语言单链队列的表示与实现实例详解

    C语言单链队列的表示与实现实例详解 什么是队列? 在计算机科学中,队列(Queue)是一种特殊的数据结构,它只允许在一端进行插入操作,在另一端进行删除操作。将新元素插入队列的过程可以称之为入队,而将元素从队列中删除的过程则可以称之为出队。队列的核心思想是“先进先出”(First In First Out,FIFO),即先入队的元素先出队。 单链队列的表示方式…

    数据结构 2023年5月17日
    00
  • 二叉搜索树的本质

    引言 打算写写树形数据结构:二叉查找树、红黑树、跳表和 B 树。这些数据结构都是为了解决同一个基本问题:如何快速地对一个大集合执行增删改查。 本篇是第一篇,讲讲搜索树的基础:二叉搜索树。 基本问题 如何在一千万个手机号中快速找到 13012345432 这个号(以及相关联信息,如号主姓名)? 最笨的方案 把一千万个手机号从头到尾遍历一遍,直到找到该手机号,返…

    算法与数据结构 2023年4月17日
    00
  • C++ 数据结构超详细讲解单链表

    C++ 数据结构超详细讲解单链表 什么是单链表 单链表是一种常见的线性数据结构,它由若干个节点组成,每个节点包含两部分内容:数据域和指针域。其中数据域存储节点所携带的数据,而指针域存储下一个节点的地址。 单链表的性质在于每个节点只有一个指针域,而第一个节点叫做头节点,通常不存放数据,只用来标注链表的起始位置。最后一个节点的指针域指向 NULL,即表示链表的结…

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