抖音高频编程考题:翻转二叉树(简单)

题目描述

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

示例 1:

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

示例 2:

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

示例 3:输入:root = [] 输出:[]

提示:

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

解题思路

定义:翻转二叉树的操作是交换每个节点的左子树和右子树。这个操作从根节点开始,然后递归地进行到每个子节点。递归

  1. 基本情况:如果当前节点为空(root == null),则返回 null
  2. 交换子树:交换当前节点的左子树和右子树。
  3. 递归调用:递归地对左子树和右子树进行翻转。
  4. 返回节点:返回当前节点(其子树已经翻转)。

复杂度分析

  • 时间复杂度O(n)。其中 n 是树中的节点数。每个节点都需要访问一次以进行交换和递归操作。因此,时间复杂度是 O(n)。

  • 空间复杂度O(h)。其中 h 是树的高度。递归调用会消耗栈空间,栈的深度是树的高度。最坏情况下,树是链式结构(即退化为单边树),高度为 n,所以空间复杂度是 O(n)。但对于平衡树,树的高度是 log(n),因此在平衡树的情况下,空间复杂度是 O(log n)。

代码实现

package org.zyf.javabasic.letcode.hot100.tree;

import org.zyf.javabasic.letcode.tree.base.TreeNode;

/**
 * @program: zyfboot-javabasic
 * @description: 翻转二叉树(简单)
 * @author: zhangyanfeng
 * @create: 2024-08-22 11:00
 **/
public class InvertTreeSolution {
    // 翻转二叉树的递归方法
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        // 交换左右子树
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        // 递归翻转左右子树
        invertTree(root.left);
        invertTree(root.right);

        return root;
    }

    // 打印树的中序遍历(用于验证)
    public void printInOrder(TreeNode root) {
        if (root != null) {
            printInOrder(root.left);
            System.out.print(root.val + " ");
            printInOrder(root.right);
        }
    }

    // 测试主函数
    public static void main(String[] args) {
        // 构造测试用例
        TreeNode root1 = new TreeNode(4);
        root1.left = new TreeNode(2);
        root1.right = new TreeNode(7);
        root1.left.left = new TreeNode(1);
        root1.left.right = new TreeNode(3);
        root1.right.left = new TreeNode(6);
        root1.right.right = new TreeNode(9);

        TreeNode root2 = new TreeNode(2);
        root2.left = new TreeNode(1);
        root2.right = new TreeNode(3);

        TreeNode root3 = null;

        // 创建 Solution 实例并进行测试
        InvertTreeSolution solution = new InvertTreeSolution();

        // 翻转并打印结果
        TreeNode invertedRoot1 = solution.invertTree(root1);
        TreeNode invertedRoot2 = solution.invertTree(root2);
        TreeNode invertedRoot3 = solution.invertTree(root3);

        System.out.print("Inverted Tree 1 (InOrder): ");
        solution.printInOrder(invertedRoot1); // 输出应为 9 7 6 4 3 2 1
        System.out.println();

        System.out.print("Inverted Tree 2 (InOrder): ");
        solution.printInOrder(invertedRoot2); // 输出应为 3 2 1
        System.out.println();

        System.out.print("Inverted Tree 3 (InOrder): ");
        solution.printInOrder(invertedRoot3); // 输出应为空
        System.out.println();
    }
}

  具体可见:LeetCode 热题 100 回顾_leetcode热题100-CSDN博客

要获取抖音用户的关注列表,可以使用Python的第三方库requests和抖音的私有API接口。具体步骤如下: 1. 通过requests库向抖音的API接口发送请求,获取用户的uid。 2. 使用uid作为参数,向另一个API接口发送请求,获取该用户关注列表的加密参数sec_uid和max_time。 3. 使用获取到的sec_uid和max_time作为参数,再次发送请求,获取该用户的关注列表。 示例代码如下: ``` import requests import json import time import hashlib # 抖音API接口 api_url = 'https://aweme.snssdk.com' # 请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 'Accept': 'application/json', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': 'https://www.douyin.com/', } # 用户名 user_name = 'xxxx' # 请求参数 params = { 'device_id': 'xxxx', 'iid': 'xxxx', 'openudid': 'xxxx', 'uid': '', 'count': '20', 'max_time': '', 'sec_user_id': '', 'source': 'follow', 'type': '0', 'cursor': '0', 'verifyFp': '', } # 获取用户uid url = api_url + '/aweme/v1/user/?user_name=' + user_name response = requests.get(url=url, headers=headers) data = json.loads(response.text) uid = data['user']['uid'] # 获取加密参数 url = api_url + '/aweme/v1/user/following/list/?user_id=' + uid response = requests.get(url=url, headers=headers) data = json.loads(response.text) sec_uid = data['extra']['now'] max_time = str(int(time.time() * 1000)) # 获取关注列表 url = api_url + '/aweme/v1/user/following/list/?user_id=' + uid + '&sec_user_id=' + sec_uid + '&max_time=' + max_time response = requests.get(url=url, headers=headers) data = json.loads(response.text) for user in data['followings']: print(user['nickname']) ``` 需要注意的是,抖音API接口是私有的,可能会随时变更。同时,使用API接口获取数据需要模拟请求头信息和加密参数等信息,需要一定的技术功底。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值