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日

相关文章

  • Java数据结构之哈夫曼树概述及实现

    Java数据结构之哈夫曼树概述及实现 哈夫曼树概述 哈夫曼树(Huffman Tree),也称为最优树(Optimal Binary Tree),是一种带权路径长度最短的二叉树,也就是最小权重的前缀编码树。其基本思想是采用频率作为节点的权值,将频率较小的节点放在左子树上,频率较大的节点放在右子树上,从而形成一棵权值最小的二叉树。 实现过程 实现哈夫曼树需要以…

    数据结构 2023年5月17日
    00
  • C语言数据结构之二叉树详解

    C语言数据结构之二叉树详解 什么是二叉树? 二叉树是一种非常常用的数据结构,它具有以下几个特点: 在二叉树中,每个节点最多有两个子节点,其中一个称为左子节点,另一个称为右子节点。 每个节点都有一个值,这个值可以是任意类型的,比如整数、字符、指针等等。 可以使用递归的方式来遍历一个二叉树,具体包括前序遍历、中序遍历和后序遍历。 二叉树的存储方式 二叉树可以使用…

    数据结构 2023年5月17日
    00
  • C++深入分析讲解链表

    C++深入分析讲解链表 链表概述 链表是数据结构中最基本和重要的一种,它的实现可以分为链表的节点和链表的指针。每个节点都记录着链表中的一个元素,并带有一个指向下一个节点的指针,这样就可以通过遍历指针,达到遍历链表的目的。 链表数据结构 在C++中,链表可以通过结构体或者类来实现,比如以下这个结构体实现的单向链表: struct Node { int data…

    数据结构 2023年5月17日
    00
  • C语言进阶数据的存储机制完整版

    C语言进阶数据的存储机制完整版攻略 1. 前言 C语言是一门高度可控的语言,其中其数据的存储机制是必须掌握的基础知识点。本文介绍了C语言数据存储的机制,包括变量在内存中的分配、指针的应用及结构体的组织等内容,旨在帮助读者掌握C语言中的数据存储机制。 2. 变量在内存中的分配 变量在内存中的分配既涉及到内存的分配可操作性,也涉及到相应的存储结构。 2.1. 变…

    数据结构 2023年5月17日
    00
  • 数据结构 数组顺序存储详细介绍

    数据结构数组顺序存储详细介绍 什么是数组顺序存储? 数组是最基本的数据结构之一,在计算机程序中使用广泛。在数组中,存储的元素类型相同且占用相同的内存空间,可以通过下标进行快速访问和修改。数组可以使用不同的方法来存储在内存中,其中最简单的方法是数组顺序存储。 数组顺序存储是指将元素按照顺序依次存储在内存中的一块连续地址中,可以方便地进行随机访问。这种方式与链式…

    数据结构 2023年5月17日
    00
  • C#数据结构揭秘一

    C#数据结构揭秘一攻略 C#数据结构是每个C#程序员必须熟练掌握的技能之一。本攻略将介绍常见的C#数据结构,包括数组、列表、栈、队列、散列表和字典。我们将会深入了解它们的特点、使用场景和使用方法,并附带代码示例加深理解。 数组 数组是存储单一类型元素的固定大小的集合结构。在C#中,可以使用以下方式声明和初始化一个数组: int[] nums1 = new i…

    数据结构 2023年5月17日
    00
  • Java数据结构之线索化二叉树的实现

    Java数据结构之线索化二叉树的实现 线索化二叉树的概述 线索化二叉树(Threaded Binary Tree)是一种优化的二叉树结构。它的优点是可以在O(n)的时间复杂度内,进行中序遍历。而在普通二叉树中进行中序遍历需要的时间复杂度是O(nlogn)。线索化二叉树的原理是利用空闲的指针域,来记录中序遍历中前驱与后继结点的位置。线索化二叉树中会出现两种类型…

    数据结构 2023年5月17日
    00
  • C数据结构中串简单实例

    下面我将为您详细讲解C语言中串的简单实例。 1. 什么是串 在C语言中,串(String)是由一系列字符组成的序列,是一种常见的数据类型。在C语言中,串通常是以字符数组(Char Array)的方式进行存储的。 2. 定义和初始化串 在C语言中,定义和初始化串可以通过以下方式进行: #include <stdio.h> #include <…

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