首页 > 其他分享 >【数据结构】二叉树

【数据结构】二叉树

时间:2024-07-25 13:52:54浏览次数:9  
标签:Node 遍历 const void nullptr 二叉树 数据结构 root

二叉树

结构描述:

#include <iostream>
#include <queue>

using namespace std;

typedef int DataType;

class Node {
private:
    DataType data;
    Node * left;
    Node * right;
    friend class BinaryTree;
};

typedef class BinaryTree {
private:
    Node * root;
    //前序遍历
    void preOrderTraverse(const Node * root);
    //中序遍历
    void inOrderTraverse(const Node * root);
    //后序遍历
    void postOrderTraverse(const Node * root);
    //层序遍历
    void levelOrderTraverse(const Node * root);

public:
    //初始化
    BinaryTree() {
       root = nullptr;
    }
    //分配节点
    Node * buyNode(DataType x);
    //手动构建
    void createManual();
    //前序遍历
    void preOrderTraverse();
    //中序遍历
    void inOrderTraverse();
    //后序遍历
    void postOrderTraverse();
    //层序遍历
    void levelOrderTraverse();
}BT;

前序遍历

  • 树空:返回空
  • 非空:
    1. 处理根节点
    2. 处理左子树
    3. 处理右子树
void BT::preOrderTraverse(const Node * root) {
    if (root == nullptr) {
        return;
    }
    
    cout << root->data << " ";
    preOrderTraverse(root->left);
    preOrderTraverse(root->right);
}

中序遍历

  • 树空:返回空
  • 非空:
    1. 处理左子树
    2. 处理根节点
    3. 处理右子树
void BT::inOrderTraverse(const Node * root) {
    if (root == nullptr) {
        return;
    }

    inOrderTraverse(root->left);
    cout << root->data << " ";
    inOrderTraverse(root->right);
} 

后序遍历

  • 树空:返回空
  • 非空:
    1. 处理左子树
    2. 处理右子树
    3. 处理根节点
void BT::postOrderTraverse(const Node * root) {
    if (root == nullptr) {
        return;
    }

    postOrderTraverse(root->left);
    postOrderTraverse(root->right);
    cout << root->data << " ";
}

层序遍历

  • 树空:返回空
  • 非空:
    1. 先把根节点入队,然后进入循环,对队列进行操作。
    2. 获取队头元素并输出;
    3. 判断节点的左右子节点是否存在,存在则入队;
    4. 把队头元素出队
    5. 重复2,3,4步操作,直至队空
void BT::levelOrderTraverse(const Node * root) {
    if (root == nullptr) {
        return;
    }

    //建立一个存放Node*型数据的队列
    queue<const Node *> qn;
    const Node * cur;
    //根节点先进队列
    qn.push(root);

    //队列非空时持续循环
    while (!qn.empty()) {
        //获取队头指针
        cur = qn.front();
        //输出队头元素
        cout << cur->data << " ";
        //判断是否有子节点,有则入队
        if (cur->left != nullptr) {
            qn.push(cur->left);
        }
        if (cur->right != nullptr) {
            qn.push(cur->right);
        }
        //把队头元素出队
        qn.pop();
    }
}

踩坑记录

在private和public中分别写上遍历函数,具体实现放在private中实现,用public中的函数调用即可。

但是名字是一样的时候,注意二者的参数。

标签:Node,遍历,const,void,nullptr,二叉树,数据结构,root
From: https://www.cnblogs.com/codels/p/18322845

相关文章

  • 算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公
    前言公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。二叉树篇继续。一、【236.二叉树的最近公共祖先】题目阅读给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一......
  • Redisson常用的数据结构及应用场景
    Redisson提供了一系列高级数据结构,这些数据结构封装了Redis的原生数据类型,提供了JavaAPI的便利性和分布式特性。以下是Redisson中一些常用的数据结构,场景还在不断完善中:RBucket:这是一个简单的键值对存储,相当于Redis中的String类型。你可以使用它来存储和检索......
  • 数据结构与算法从淬体到元婴day05之栈
    栈数据结构栈(Stack)是一种遵循后进先出(LIFO,LastInFirstOut)原则的有序集合。栈只能在一端(称为栈顶,Top)进行插入(push)和删除(pop)操作,另一端(称为栈底,Bottom)是固定的。这种特性使得栈在解决具有后进先出特性的问题时非常有用,比如函数调用、括号匹配、撤销操作等。栈的基本操作p......
  • 数据结构(3)(顺序栈)
     栈:      栈是限定仅在栈顶进行插入和删除操作的线性表,在操作的时候,只允许栈顶改变不允许栈底改变,具有后进先出的特征。顺序栈:      顺序栈是一种使用数组实现的栈,也称为数组栈。其基本思路是通过数组来存储栈中的元素,并通过栈顶指针指示栈顶元素在数组中的位......
  • 双向链表<数据结构 C版>
    目录关于链表的分类 双向链表结构体初始化尾插头插打印判断是否为空尾删头删查找指定位置之后的插入指定位置的删除销毁关于链表的分类根据链表的三大特性,单向or双向、带头or不带头、循环or不循环,可将链表分为2*2*2,8种链表,前面我们已经实现了单链表,即:不带头......
  • Java二叉树经典进阶OJ题解
     目录一、判断一颗二叉树是否为对称二叉树1.题目描述:2.代码示例:3.通过演示与分析:二、根据先序遍历结果构造二叉树1.题目描述:2.代码示例:3.通过演示与分析:三、层序遍历的非递归实现1.题目描述:2.代码示例:3.通过演示与分析:四、判断是否为完全二叉树1.题目描述:2.......
  • 【数据结构初阶】一篇文章带你超深度理解【单链表】
     hi!目录前言:1、链表的概念和结构2、单链表(SingleList,简写SList)的实现2.1  定义链表(结点)的结构2.2 创建一个链表2.3 打印链表2.4 尾插2.5 头插2.6 尾删2.7 头删2.8 查找2.9 在指定位置之前插入数据2.10 在指定位置之后插入数据2.11......
  • 【数据结构】树和二叉树
    目录1.前言2.树2.1树的概念2.2树中的重要概念2.3树的表示形式 2.4树的应用3.二叉树3.1概念3.2两种特殊的二叉树3.3二叉树的性质3.4二叉树的存储3.5二叉树的遍历方式3.5.1创建二叉树3.5.2二叉树的遍历3.6二叉树的基本操作4.总结1.前言二叉树是数据结构中......
  • 数据结构与算法,剑指Offer 50题
    队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。对列的添加insertappend队列的取值列表[-1]列表[0]队列的删......
  • 最全数据结构个人笔记【单向链表】
    1.链表基本概念链式存储的线性表,简称链表链表其实是由一个或者多个结构体通过指针指向的关系构成我们把每个结构体的变量称为节点,节点里面由两个成员组成一个是数据域,另外一个是指针域,指针域是用于存放下一个节点的地址以此类推,我们把这种存储方式称为链式存储2.链......