链表
数组
1.回文子串一定是中心对称的。
2.前缀和
利用一个数组表示另一个数组的前n-1个元素的和,就是前缀和。
二叉树
1.最重要的是无论是哪种遍历方法,不要进入其中的回溯,仅仅看框架就可以了
// 注意:cpp 代码由 chatGPT🤖 根据我的 java 代码翻译,旨在帮助不同背景的读者理解算法逻辑。
// 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 java 代码对比查看。
// 定义:输入一棵二叉树的根节点,返回这棵树的前序遍历结果
vector<int> preorderTraverse(TreeNode* root) {
vector<int> res;
if (root == nullptr) {
return res;
}
// 前序遍历的结果,root->val 在第一个
res.push_back(root->val);
// 利用函数定义,后面接着左子树的前序遍历结果
vector<int> leftRes = preorderTraverse(root->left);
res.insert(res.end(), leftRes.begin(), leftRes.end());
// 利用函数定义,最后接着右子树的前序遍历结果
vector<int> rightRes = preorderTraverse(root->right);
res.insert(res.end(), rightRes.begin(), rightRes.end());
return res;
}
例如这段代码,表面上看他会不断刷新res,但是其中只看一个只有三个节点的二叉树的话,他的结构并没有什么问题。
2.这是一个计算二叉树最大深度的代码,难懂=,=
// 注意:cpp 代码由 chatGPT🤖 根据我的 java 代码翻译,旨在帮助不同背景的读者理解算法逻辑。
// 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 java 代码对比查看。
// 定义:输入根节点,返回这棵二叉树的最大深度
int maxDepth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
// 利用定义,计算左右子树的最大深度
int leftMax = maxDepth(root->left);
int rightMax = maxDepth(root->right);
// 整棵树的最大深度等于左右子树的最大深度取最大值,
// 然后再加上根节点自己
int res = max(leftMax, rightMax) + 1;
return res;
}
这应该算的上是一个后序遍历的二叉树,后序遍历是可以获得子树的信息的。leftmax和rightmax是不会刷新的,所以是迭代的,因此可以动态的得到最大深度。
下面是一个反应前序和后序信息差的比较好的例子,题目是leetcode中寻找二叉树最大直径。分别是前序和后序,这题前序代码是O(N^2),因为可能要重复遍历两次。而后序是O(N)。
class Solution {
public:
int ans = 0;
int diameterOfBinaryTree(TreeNode* root) {
traverse(root);
return ans;
}
void traverse(TreeNode* root)//计算单个节点的最大左子树和最大右子树。
{
if(root==nullptr)
{
return;
}
int leftmax = maxdepth(root -> left);
int rightmax = maxdepth(root -> right);
int res = leftmax + rightmax;
ans = max(ans,res);
traverse(root -> left);
traverse(root -> right);
}
int maxdepth(TreeNode* root)//计算最大子树
{
if(root == nullptr)
{
return 0;
}
int leftmax = maxdepth(root -> left);
int rightmax = maxdepth(root -> right);
return 1 + max(leftmax,rightmax);
}
};
// 注意:cpp 代码由 chatGPT🤖 根据我的 java 代码翻译,旨在帮助不同背景的读者理解算法逻辑。
// 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 java 代码对比查看。
class Solution {
// 记录最大直径的长度
int maxDiameter = 0;
public:
int diameterOfBinaryTree(TreeNode* root) {
maxDepth(root);
return maxDiameter;
}
int maxDepth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int leftMax = maxDepth(root->left);
int rightMax = maxDepth(root->right);
// 后序位置,顺便计算最大直径
int myDiameter = leftMax + rightMax;
maxDiameter = max(maxDiameter, myDiameter);
return 1 + max(leftMax, rightMax);
}
};