二叉树的最大深度——maximum-depth-of-binary-tree给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
12输入:root = [3,9,20,null,null,15,7]输出:3
示例 2:
12输入:root = [1,null,2]输出:2
提示:
树中节点的数量在 [0, 104] 区间内。
-100 <= Node.val <= 100
给我的第一看法是这个题给我的输入是层次遍历来的,如果要按我之前写c++的思路来就是先写一个确定二叉树的函数,然后再递归求出最大深度
后来发现是root已经是给好的二叉树,直接写最大深度的函数就行
法一:深度优先搜索DFS思路与算法
如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为
max(l,r)+1
而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右 ...
101. 对称二叉树——symmetric-tree给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
12输入:root = [1,2,2,3,4,4,3]输出:true
示例 2:
12输入:root = [1,2,2,null,3,null,3]输出:false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
法一:递归思路和算法
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
它们的两个根结点具有相同的值
每个树的右子树都与另一个树的左子树镜像对称
我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。
代码如下。
123456789101112131415class Solution ...
94. 二叉树的中序遍历——binary-tree-inorder-traversal给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
12输入:root = [1,null,2,3]输出:[1,3,2]
示例 2:
12输入:root = []输出:[]
示例 3:
12输入:root = [1]输出:[1]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
我发现这题肯定要用递归,但是题目条件给的函数的返回值是List,但是递归到空结点直接退出,所以要写另一个函数
法一:递归思路与算法
首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。
定义 inorder(root) 表示当前遍历到 root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 root ...
70. 爬楼梯——climbing-stairs假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
12345输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶
示例 2:
123456输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
提示:
1 <= n <= 45
第一反应就是一个一个去数,先算全是1的,再算有一个2阶的,直到最后
看答案发现可以用动态规划或者其他方法写
法一:动态规划思路和算法
我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:
f(x)=f(x−1)+f(x−2)
它意味着爬到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和。很好理解,因为每次只能爬 1 级或 2 级,所以 f(x) 只能从 f(x−1) 和 f( ...
21. 合并两个有序链表——merge-two-sorted-lists将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
12输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
示例 2:
12输入:l1 = [], l2 = []输出:[]
示例 3:
12输入:l1 = [], l2 = [0]输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
这题之前用c++写的,写了好像有一百多行(类似后面的法二)
思路是:用双指针,分别指向两个待合并的链表,只要两个表不空,就依次比较两个指针指向结点的值,把小的放入新的链表里面,如果有一个链表空了,就把另一个剩余的接到新链表
决定直接看答案,学习新方法,发现新方法真简单:
法一:递归
法二:迭代
法一:递归思路
我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):
12li ...
20. 有效的括号——valid-parentheses给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
12输入:s = "()"输出:true
示例 2:
12输入:s = "()[]{}"输出:true
示例 3:
12输入:s = "(]"输出:false
示例 4:
12输入:s = "([])"输出:true
示例 5:
12输入:s = "([)]"输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
法一:栈(我的正确答案)1 ...
1. 两数之和——two-sum给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例 3:
12输入:nums = [3,3], target = 6输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
法一:暴力枚举(我的答案)思路及算法
最容易想到的方法是枚举数组中的每一个数 x,寻 ...
2-2 求根结点到x结点的路径分数 4
作者 王东
单位 贵州师范学院
求根结点到x结点的路径(假定结点不重复)。
输入样例:输入一行字符序列先序递归构建二叉树。每个字符对应一个结点,#表示空结点。第二行输入一个结点值x。
1252#3##41##6##3
输出样例:输出从根到结点x的路径。
15 2 3
我的错误答案
测试点
提示
内存(KB)
用时(ms)
结果
得分
0
308
2
答案错误
0 / 2
1
520
2
答案正确
2 / 2
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <iostream>using namespace std;typedef struct BTNode { int data; BTNode *lchild, *rchild;};BTNode* CreateBTree(BTNode *p) { char ...
2-1 玩转二叉树分数 6
作者 陈越
单位 浙江大学
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:12371 2 3 4 5 6 74 1 3 2 6 5 7
输出样例:14 6 1 7 5 3 2
跟上一题1-9PTA(树和二叉树)1-9 确定二叉树(先序序列+中序序列) | zhangzhang-blog类似,这个题要实现的功能更多:创建二叉树+反转二叉树+遍历二叉树
答案12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 ...
1-9 确定二叉树(先序序列+中序序列)分数 3
作者 黄龙军
单位 绍兴文理学院
要求实现函数,根据二叉树的先序序列和中序序列确定二叉树并返回指向二叉树根结点的指针。二叉树采用二叉链表存储,结点结构如下:
123456789struct BiTNode { // 结点结构 int data; // 数据域 BiTNode *lchild,*rchild; // 左右孩子指针 BiTNode(int d,BiTNode *left,BiTNode *right) { // 构造函数 data=d; lchild=left; rchild=right; }};
函数接口定义:1BiTNode* CreateBT(int* pre, int *in, int n);
其中参数 pre是指向先序序列 ...


