实习冲刺Day15
算法题
对称二叉树
101. 对称二叉树 - 力扣(LeetCode)
对称的含义:
完全相同
不对称的情况:左右子树层数不同
左右子树数值不同
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
* right(right) {}
* };
*/
class Solution {
public:
bool fun(TreeNode* p, TreeNode* q) {
if (!p && !q)//左右两边同时为空的时候,证明二叉树左右两方都遍历结束了,返回true
return true;
if (!p || !q)//只要有一个为空了,那就是不对称
return false;
if (p->val != q->val)//数值不相等,也是不对称
return false;
bool l = fun(p->left, q->right);//遍历左子树的左子树,又子树的右子树
bool r = fun(p->right, q->left);//右边
return l && r;
}
bool isSymmetric(TreeNode* root) {
return fun(root->left, root->right);
}
};
基础知识
请解释new和malloc的区别,并分别解释他们的用法
new是运算符在c++中支持运算符重载,malloc是库函数,不支持函数重载
new的返回值不需要强转,malloc的返回值是void*类型的,需要强转
new申请空间失败会抛出异常,malloc申请失败会返回为空
new申请空间不用填具体大小,malloc需要详细具体申请多大空间
new出的空间需要delete释放,malloc申请玩的空间需要free释放
使用new操作符来分配对象内存时会经历三个步骤:
调用operator new 函数(对于数组是operator new[])分配一块足够的内存空间(通常底层默认使用malloc实现,除非程序员重载new符号)以便存储特定类型的对象;
malloc分配失败会导致什么问题
- 程序异常终止 :在很多情况下,如果程序没有对
malloc
失败进行妥善处理,当malloc
无法分配所需内存时,它可能会返回NULL
指针。后续若程序继续尝试对这个NULL
指针进行解引用操作(例如向其写入数据或读取数据),就会导致程序崩溃。这种崩溃可能表现为段错误,因为程序试图访问非法的内存地址。 - 内存泄漏 :如果部分内存分配失败,但之前已经分配的用于管理这个数据结构的内存没有被释放,那么这部分内存就会一直被占用,直到程序结束,降低了内存的利用率。