首页 > 编程语言 >代码随想录算法 - 二叉树

代码随想录算法 - 二叉树

时间:2024-09-10 11:28:42浏览次数:11  
标签:right TreeNode int 随想录 算法 二叉树 return root left

题目1 226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

img

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

思路

这道题可以用先序,中序,后序或者层序遍历去做,思路都是类似的。

递归调用

注意递归结束条件是root为nullptr,在每个非空结点上进行左右孩子指针的交换就行了。

代码

/**
 * 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:
    TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        TreeNode* tmp = root->left;
        root->left = root->right;
        root->right = tmp;
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

迭代遍历翻转

使用一个辅助的栈或者队列来存储子结点就可以做了。

代码

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> nodeStack;
        nodeStack.push(root);
        while(!nodeStack.empty())
        {
            TreeNode* curNode = nodeStack.top();
            nodeStack.pop();
            if(curNode == nullptr)
                continue;
            nodeStack.push(curNode->left);
            nodeStack.push(curNode->right);
            swap(curNode->left, curNode->right);
        }
        return root;
    }
};

题目2 101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

img

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

img

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路

这道题就是将树拆分为左右两个子树,对子树进行相反方向的遍历比较就行了,可以使用递归法和迭代法,思路是类似的我用的是迭代法。

迭代法

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root->left && !root->right)
            return true;
        stack<TreeNode*> nodeStack1, nodeStack2;
        nodeStack1.push(root->left);
        nodeStack2.push(root->right);
        while(!nodeStack1.empty() && !nodeStack2.empty())
        {
            TreeNode* lft = nodeStack1.top(),
                    * rht = nodeStack2.top();
            nodeStack1.pop();
            nodeStack2.pop();
            if(!lft && !rht)
            {
                continue;
            }
            if(!lft || !rht || lft->val != rht->val)
                return false;
#define PUSH(STACK, NODE, POSITION) \
            STACK.push(NODE->POSITION);
            PUSH(nodeStack1, lft, left);
            PUSH(nodeStack1, lft, right);
            PUSH(nodeStack2, rht, right);
            PUSH(nodeStack2, rht, left);
#undef PUSH
        }
        return nodeStack1.empty() && nodeStack2.empty();
    }

题目3 104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

思路

这道题可以用递归法(前,后序遍历)或者迭代法(层序遍历)来计算出深度,基础题。

递归法

/**
 * 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:
    int Nextdepth(TreeNode* root)
    {
        if(!root)
        {
            return 0;
        }
        return 1 + max(Nextdepth(root->left), Nextdepth(root->right));
    }
    int maxDepth(TreeNode* root) {
        return Nextdepth(root);
    }
};

迭代法

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(!root)
            return 0;
        queue<TreeNode*> nodeQueue;
        nodeQueue.push(root);
        int depth = 0;
        while(!nodeQueue.empty())
        {
            int num = nodeQueue.size();
            for(int i = 0; i < num; i++)
            {
                TreeNode* node = nodeQueue.front();
                nodeQueue.pop();
                if(node->left)
                    nodeQueue.push(node->left);
                if(node->right)
                    nodeQueue.push(node->right);
            }
            depth++;
        }
        return depth;
    }
};

题目4 111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

思路

和最大深度类似考察基本功,用递归法遍历每一个结点获取最小深度之后累加得到结果;或者用层序遍历迭代到最浅的无双child节点终止。

递归法

class Solution {
public:
    int NextDepth(TreeNode* root)
    {
        if(!root)
            return 0;
        if(!root->left && root->right)
            return 1 + NextDepth(root->right);
        if(root->left && !root->right)
            return 1 + NextDepth(root->left);
        return 1 + min(NextDepth(root->left), NextDepth(root->right));
    }
    int minDepth(TreeNode* root) {
        if(!root)
            return 0;
        return NextDepth(root);
    }
};

迭代法

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root)
            return 0;
        queue<TreeNode*> nodeQueue;
        nodeQueue.push(root);
        int result = 0;
        while(!nodeQueue.empty())
        {
            int num = nodeQueue.size();
            for(int i = 0; i < num; i++)
            {
                TreeNode* curNode = nodeQueue.front();
                nodeQueue.pop();
                //若节点无左右child,则为最浅的节点,返回最小深度
                if(!curNode->left && !curNode->right)
                {
                    return result + 1;
                }
                if(curNode->left)
                    nodeQueue.push(curNode->left);
                if(curNode->right)
                    nodeQueue.push(curNode->right);
            }
            result++;
        }
        return result;
    }
};

标签:right,TreeNode,int,随想录,算法,二叉树,return,root,left
From: https://www.cnblogs.com/code4log/p/18406058

相关文章

  • 代码随想录day 56 || 图论6
    Prim算法应用场景是主要是找到一个无向连通图的最小生成树,即连接所有节点且权重总和最小的树//prim三部曲//1,找到距离当前最小树最近节点//2,节点入树//3,更新mindist//更新树funcupdateMinDist(edges[][]int,nodeint){ for_,edge:=rangeedges{ ifed......
  • 看demo学算法之 自编码器
    大家好,这里是小琳AI课堂!今天我们来聊聊自编码器。......
  • 一文轻松搞定 tarjan 算法(二)(附带 tarjan 题单)
    完结篇:tarjan求割点、点双连通分量、割边(桥)(附40道很好的tarjan题目)。上一篇(tarjan求强连通分量,缩点,求边双)tarjan求割点还是求强联通分量的大致思路捏.算法思路:我们把图中的点分为两种:每一个联通子图搜索开始的根节点和其他点。判断是不是割点的方式如下:对于根......
  • 代码随想录训练营第28天|利润分解
    122.买卖股票的最佳时机IIclassSolution{public:intmaxProfit(vector<int>&prices){intsum=0,day_profit;for(inti=1;i<prices.size();i++){day_profit=prices[i]-prices[i-1];if(day_profit>0)......
  • 文心一言 VS 讯飞星火 VS chatgpt (340)-- 算法导论23.1 9题
    九、设为的一棵最小生成树,设为由为由是连通的,则的一棵最小生成树。如果要写代码,请用go语言。文心一言:要证明如果是是诱导的的子图,即诱导的的子图,即是连通的,即:由于诱导的的子图,并且是的生成树,因此是:假设存在。由于是(即中不在的权重加上的权重,由于......
  • (Matlab实现)K-means算法及最佳聚类数目的确定
      目录摘要:1.K-means算法2.Calinski-HarabaszCriterion(卡林斯基-哈拉巴斯指标,CH值)3.Davies-BouldinCriterion(戴维斯-博尔丁指标,DB值)4.GapValue(Gap值)5.SilhouetteCoefficient(轮廓系数)6.基于Matlab的K-means聚类及最佳聚类数选取结果:各种指标评价图像:K-means聚类......
  • 【pytorch(cuda)】基于DQN算法的无人机三维城市空间航线规划(Python代码实现)
       ......
  • python 实现gamma 伽玛功能算法
    gamma伽玛功能算法介绍Gamma(伽玛)功能算法通常与不同的领域和应用相关,包括但不限于图像处理、光学测试、数学计算等。以下是根据您提供的搜索结果,对Gamma伽玛功能算法的一些概述:在图像处理中的Gamma校正在图像处理中,Gamma校正是一种用于调整图像亮度的方法,特别是为了校正......
  • python 实现gaussian高斯算法
    gaussian高斯算法介绍高斯算法(Gaussianalgorithm)是一个广泛的概念,因为“高斯”这个名字与许多不同的数学和算法技术相关联。但是,在大多数情况下,当人们提到“高斯算法”时,他们可能是在指高斯消元法(Gaussianelimination),这是一种在数学中用于求解线性方程组、计算矩阵的行列......
  • 数组与贪心算法——179、56、57、228(2简2中)
    179.最大数(简单)给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。解法一、自定义比较器大的排前面然后进行一个比较jpg一开始想的其实是字典序,但是测试里就败了。例如3,3......