首页 > 编程语言 >算法力扣刷题 三十五【二叉树基础和递归遍历】

算法力扣刷题 三十五【二叉树基础和递归遍历】

时间:2024-07-08 11:57:24浏览次数:23  
标签:right TreeNode cur val nullptr 力扣 二叉树 刷题 left

前言

进入二叉树学习。
继续。


一、二叉树基础理论

理论篇——参考链接

以下是大纲:


二、遍历方式

学习递归法实现前、中、后遍历方法。

“输入”阶段

此处用了第一次递归法实现 根据题目的双指针操作,传递递归的参数。

解释递归

(1)递归:自己调用自己。重复执行一段代码,但是和循环有区别。
(2)过程:先传递,不到终止条件,继续传递;还不到终止条件,继续传递;……if判断到终止条件,开始return;返回上一层,从调用之后继续执行,结束后;再返回上一层,从调用自己之后继续执行,结束后;继续往上,直到第一层。
在这里插入图片描述

如何写好递归?

(1)前序遍历:

  • 确定递归函数的参数和返回值
    • 参数需要时可以再补充。一般需要传入root根节点数组用来存放结果
    • 返回值一般void。
  • 确定终止条件
    • if(cur == NULL) ,返回。
  • 确定单层递归的逻辑
    在这里插入图片描述
    (2)中序和后序同理。

“输出”阶段

前序遍历题目:【144.二叉树的前序遍历】

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& record){
        //终止条件
        if(cur == nullptr){
            return;
        }
        record.push_back(cur->val);//把根节点放入;
        traversal(cur->left,record);
        traversal(cur->right,record);
    }

    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root,result); //返回到这一层,说明result已经放好结果。
        return result;

    }
};

中序遍历题目:【94.二叉树的中序遍历】

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector<int>& record){
        if(cur == nullptr){
            return;
        }
        traversal(cur->left,record);//先左子树
        record.push_back(cur->val);//再根节点
        traversal(cur->right,record);//再右子树
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};

后序遍历题目:【145.二叉树的后序遍历】

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector<int>& record){
        if(cur == nullptr){
            return;
        }
        traversal(cur->left,record);    //先左子树
        traversal(cur->right,record);   //再右子树
        record.push_back(cur->val);     //再放入根节点
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};

总结

  • 为二叉树基础理论建立大纲:种类、遍历方式、存储结构。
  • 递归算法学习。建立递归的模版,确定终止条件和逻辑;
  • 二叉树前、中、后序遍历实现。

(欢迎指正,转载表明出处)

标签:right,TreeNode,cur,val,nullptr,力扣,二叉树,刷题,left
From: https://blog.csdn.net/danaaaa/article/details/140242886

相关文章

  • 【二叉树】
    目录1,树形结构(了解)1.1概念1.2概念(重要)1.3树的表示形式(了解)1.4树的应用2,二叉树(重点)2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的遍历2.6 二叉树的实现2.7二叉树的操作2.7二叉树面试题2.7.1检查两颗树是否相同2.7.2 另......
  • 数据结构:二叉树的顺序结构及代码实现
    一:二叉树的顺序结构普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操......
  • 数据结构:二叉树的链式结构及代码实现
    一.二叉树的链式结构1.1前置说明在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头......
  • Leetcode刷题记录1 哈希+双指针+滑动窗口
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言hot1001.哈希#1.两数之和#49.字母异位词分组#128.最长连续序列2.双指针#283.移动零#11.盛最多水的容器#15.三数之和#42.接雨水3.滑动窗口#3.无重复字符的最长子串#438.找到字符串中所有......
  • 数据结构初阶 遍历二叉树问题(一)
    一.链式二叉树的实现1.结构体代码typedefintBTDateType;typedefstructBinaryTreeNode{ BTDateTypedata; structBinaryTreeNode*left; structBinaryTreeNode*right;}BTNode;大概的图形是这样子2.增删查改我们这里要明确的一点的二叉树的增删查改是没有......
  • 二叉树的链式结构
    前言Hello,友友们,小编将继续重新开始数据结构的学习,前面讲解了堆的部分知识,今天将讲解二叉树的链式结构的部分内容。1.概念回顾与新增二叉树是一种数据结构,其中每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树的链式结构表示是使用指针(或引用)来连接节点,形成......
  • LCR 156. 序列化与反序列化二叉树
    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行......
  • 数据结构——二叉树相关题目
    1.寻找二叉树中数值为x的节点//寻找二叉树中数值为x的节点BTNode*TreeFind(BTNode*root,BTDataTypex)//传过来二叉树的地址和根的地址,以及需要查找的数据{ if(root==Null) { returnNull; }//首先需要先判断这个树是否为空,如果为空直接返回空 if(root->data=......
  • 力扣—盛水最大的容器—双指针
    文章目录题目解析解题思路代码实现题目解析解题思路利用单调性控制其中一个变量,使用双指针控制另一个变量。我们知道S1(面积)=h(高度)*w(宽度)。由于高度的大小是随机的不可控,所以我们可以尝试控制宽度,定义变量left和right分别指向数组第一个元素和最后一个元素......
  • 力扣第7题:整数反转 字符串函数综合运用(C++)
    给你一个32位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1] ,就返回0。假设环境不允许存储64位整数(有符号或无符号)。示例1:输入:x=123输出:321示例2:输入:x=-123输出:-321示例3:......