数据结构记录


链表
数组
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);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值