leetcode—树(easy) 3/3

本文深入探讨了二叉树的多种算法实现,包括树的相同性检验、对称性检查、最大深度查找、层次遍历、平衡树构建、平衡性判断、最小深度求解、路径总和验证及树的翻转。通过递归与迭代方法,详细解析了每种算法的思路与代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.相同的树

给定一个二叉树,编写一个函数来检验他们是否相同。

思路:递归

2.对称的树

给定一个二叉树,检查它是否是镜像对称的

思路:递归法同上一题
迭代法:用队列进行迭代,左子树按照先左后右的顺序入队,右子树按照先右后左的顺序入队

3.二叉树的最大深度

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远子节点的路径上的节点数.

思路:递归
非递归用队列:BFS(广度优先按搜索)访问每一层节点,同时在每次访问时更新最大深度。

int maxDepth(TreeNode* root) {
        queue<TreeNode*> q;
        TreeNode* node;
        q.push(root);
        
        int cur = 1;    //当前层还未遍历节点的个数
        int next = 0;    //下一层节点的个数
        int level = 0;     //遍历的层数
        
        while(!q.empty())
        {
            node = q.front();
            q.pop();
            cur--;
            
            if(node -> left != nullptr)
            {
                q.push(node -> left);
                next++;
            }
            if(node -> right != nullptr)
            {
                q.push(node -> right);
                next++;
            }
            if(cur == 0)
            {
                cur = next;
                next = 0;
                level++;
            }
        }
        return level;
    }

4.二叉树的层次遍历II

给定一个 二叉树,返回其节点自底向上的层次遍历(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

思路:与上一题BFS思路一样

5.将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

思路:类似于分治法递归建立二叉树

TreeNode* makeTree(vector<int>& nums, int start, int end)   //start和end为下标
    {
        int mid = (start + end) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        if(start < end)
        {
            if(mid == start)
            {
                root -> left = nullptr;
                root -> right = makeTree(nums, mid + 1, end);
            }
            else if(mid == end)
            {
                root -> left = makeTree(nums, start, mid - 1);
                root -> right = nullptr;
            }
            else
            {
                root -> left = makeTree(nums, start, mid - 1);
                root -> right = makeTree(nums, mid + 1, end);
            }
        }
        else
        {
            root -> left = nullptr;
            root -> right = nullptr;
        }
        return root;   
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if(nums.size() == 0)
        {
            return {};
        }
        return makeTree(nums, 0, nums.size()- 1);
    }

6.平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树

思路:递归判断左右子树的高度

int height(TreeNode* root)
    {
        if(root == nullptr)
        {
            return 0;
        }
        return 1 + max(height(root -> left), height(root -> right));
    }
    bool isBalanced(TreeNode* root) {
        if(root == nullptr)
        {
            return true;
        }
        int left = height(root -> left);
        int right = height(root -> right);
        if(left - right > 1 || left - right < -1)
        {
            return false;
        }
        return isBalanced(root -> left) && isBalanced(root -> right);
    }

7.二叉树的最小深度

给定一个二叉树,找到其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

递归

int minDepth(TreeNode* root) {
        if(root == nullptr)
        {
            return 0;
        }
        if(root -> left != nullptr && root -> right != nullptr)
        {
            return 1 + min(minDepth(root -> left), minDepth(root -> right));
        }
        else
        {
            return 1 + minDepth(root -> left) + minDepth(root -> right);
        }
    }

8. 路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

递归

bool hasPathSum(TreeNode* root, int sum) {
        if(root == nullptr)
        {
            return false;
        }
        //终止条件——叶子节点
        if(root -> left == nullptr && root -> right == nullptr)
        {
            return sum - root->val == 0;
        }
        return hasPathSum(root -> left, sum - root->val) || hasPathSum(root -> right, sum - root->val);
    }

9.翻转二叉树

递归

TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr)
        {
            return root;
        }
        TreeNode* temp = root -> left;
        root -> left = root -> right;
        root -> right = temp;

        invertTree(root -> left);
        invertTree(root -> right);

        return root;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值