首页 > 编程语言 >学习笔记4——二叉树(C++版)

学习笔记4——二叉树(C++版)

时间:2024-08-30 11:50:52浏览次数:8  
标签:遍历 TreeNode C++ 笔记 right 二叉树 root left

关于二叉树的算法题一般都是使用递归来实现,所以要想做好二叉树的算法题,要先学会递归算法的使用。

一、如何创建一个二叉树
1.声明一个树节点结构体
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
2.创建根节点
TreeNode *node1 = TreeNode(1);
TreeNode *node2 = TreeNode(2);
TreeNode *node3 = TreeNode(3);
TreeNode *node4 = TreeNode(4);
TreeNode *node5 = TreeNode(5);
TreeNode *node6 = TreeNode(6);
TreeNode *node7 = TreeNode(7);
3.连接节点
node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->right = node5;
node3->left = node6;
node3->right = node7;
//和链表一样,知道第一个节点,就可以搜索所有的节点,所以我们可以用根部节点来代表整个二叉树
//即TreeNode* node1代表了整棵二叉树

这样一来,我们就创建了一个简单的二叉树了。

二、二叉树的分类

1.满二叉树 

除了最后一层,其他层都包含左右节点。

2.完全二叉树

树的1~n层是一个满二叉树,最后一层的节点全部靠左。(node5不能缺)

3.二叉搜索树

左树内所有的节点小于根节点,右数内所有的节点大于根节点。

注意:node5>node2,但是node5<node1。

4.平衡二叉树

平衡指的是左右平衡,左树右树高度差不超过1;左树右数都是一棵平衡树。

下面这棵树左边高度为2,右边为0,不是一棵平衡二叉树。

三、二叉树的遍历

我们拿这棵树来举例子。

1.深度优先遍历(DFS)

前序遍历(中左右)

void preOrder(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    std::cout << root->val << " ";  // 访问根节点
    preOrder(root->left);           // 遍历左子树
    preOrder(root->right);          // 遍历右子树
}
//输出node1、node2、node4、node5、node3、node6、node7

中序遍历(左中右)

void inOrder(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    inOrder(root->left);            // 遍历左子树
    std::cout << root->val << " ";  // 访问根节点
    inOrder(root->right);           // 遍历右子树
}
//输出node4、node2、node5、node1、node6、node3、node7

后续遍历(左右中)

void postOrder(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    postOrder(root->left);          // 遍历左子树
    postOrder(root->right);         // 遍历右子树
    std::cout << root->val << " ";  // 访问根节点
}
//输出node4、node5、node2、node6、node7、node3、node1
2.广度优先遍历(BFS)

层序遍历

void levelOrder(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    std::queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        TreeNode* node = q.front();
        q.pop();
        std::cout << node->val << " ";
        if (node->left) q.push(node->left);
        if (node->right) q.push(node->right);
    }
}
//输出node1、node2、node3、node4、node5、node6、node7
//这段代码的意思是:第一轮,取树头、把左树压入队列、把右树压入队列
                  //第二轮,取左树的树头、把左树的左树压入队列、把左树的右树压入队列;
                   //然后取右树的树头、把右树的左树压入队列、把右树的右树压入队列;
                  //第三轮。。。。

标签:遍历,TreeNode,C++,笔记,right,二叉树,root,left
From: https://blog.csdn.net/weixin_52133252/article/details/141467844

相关文章

  • 分享丨【题单】链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)
    作者:灵茶山艾府链接:https://leetcode.cn/circle/discuss/K0n2gO/一、链表注:由于周赛中的链表题可以转成数组处理,难度比直接处理链表低,故不标明难度分。带着问题去做下面的题目:在什么情况下,要用到哨兵节点(dummynode)?在什么情况下,循环条件要写while(node!=null)?什么情况......
  • Min_25 筛学习笔记
    \(\text{Min}\_25\)筛学习笔记事实上我又学习了一个有点春的筛法。\(\text{Min}\_25\)筛用于求解积性函数的前缀和,即形如\(g(n)=\sum_{i=1}^{n}f(i)\)形式的函数\(g\)。众所周知,朴素筛法之所以无法做到低于线性是因为枚举了区间内的每一个数,那么我们想要做到低于线性,就必然......
  • c++解析xml文件实际应用(增删改查进阶)看完必会
    《c++解析xml文件(增删改查)看完必会》遍历xml所有节点下的数据已经在上一篇文章末尾写道,写法大同小异,资源下载也在上一篇提到,这里就不再提及,这篇博客主要是对上一篇基础知识的运用,如有疑问,可以call我XML解析类#include<iostream>#include<string>#include<string.h>#include......
  • MuJoCo 学习笔记:简介 Overview
    MuJoCo官方文档给出了详细介绍MuJoCoOverview。下面截取部分相对重要的内容翻译记录。参考:Mujoco官方文档中文翻译1-概述1.KeyFeature广义坐标+现代接触动力学Generalizedcoordinatescombinedwithmoderncontactdynamics物理引擎传统上分为两类。1.机器人学和......
  • C++学习随笔——C++11的array、forward_list、tuple的用法
    1.std::arraystd::array是C++11引入的一个封装了原生数组的容器,它结合了C++标准库容器的优点和C风格数组的效率。#include<array>#include<iostream>intmain(){std::array<int,5>arr={1,2,3,4,5};//初始化一个大小为5的数组//访问元素......
  • C++学习随笔——委托构造函数
    C++11中,引入了委托构造函数(delegatingconstructors)的概念。委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以减少代码重复。 委托构造函数的语法:classMyClass{public:MyClass(intx):value(x){//这个构造函数初始化value}M......
  • 【C++】vector(下)--上篇
    个人主页~vector(上)~vector二、vector的模拟实现1、了解组成2、vector.h(1)为什么有了size_t参数的vector构造函数还要再写一个int参数的重载vector构造函数(2)为什么reserve不用memcpy(3)reserve和resize的相关解释(4)迭代器失效问题详解二、vector的模拟实现1、了解组......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • Java学习笔记11-流程控制语句结构
    一.顺序结构顺序结构顺序结构是最简单的流程控制结构,它按照代码书写的顺序依次执行每一条语句。例如:inta=1,b=2,c=3;System.out.println("a+b="+(a+b));System.out.println("b*c="+(b*c));二.分支结构if分支判断(1).单if条件判断if(条件,条件的......
  • 【408DS算法题】029基础-二叉树的层次遍历
    Index题目本文稍后补全,以下内容来自:https://blog.csdn.net/weixin_60702024/article/details/141615340分析实现总结题目本文稍后补全,以下内容来自:https://blog.csdn.net/weixin_60702024/article/details/141615340给定二叉树的根节点root,写出函数实现对二叉树的层......