二叉树的最近公共祖先
总体思想是:对二叉树进行先序遍历,当遍历到两个子节点的时候直接返回节点,同时也要处理空节点。一共分三种情况:
- 如果在root节点的左边找到了一个 右边找到了一个 那就说明root就是最近的公共祖先。
- 如果只有左子树的结果非空(即 left 不为空),这说明 p 和 q 都在左子树中或者其中一个是左子树中的节点,且另一个节点的祖先也在左子树中,那么就返回左子树找到的结果 left。
- 如果左子树的结果为空,那就返回右子树的结果 right ,因为此时 p 和 q 要么都在右子树中,要么其中一个是右子树中的节点且另一个节点的祖先也在右子树中。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q)return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left && right)return root;
if (left)return left;
return right;
}
什么是隐式类型转换?隐式类型转换可能带来哪些问题?
隐式类型转换也可以叫自动类型转换,是指编译器自动进行的将一种类型的变量转换成另外一种类型,不用程序员明确表明转换操作。
一般有以下几种情况会发生隐式类型转换:
- 算数运算:当不同的类型进行算数运算时,编译器会自动将较小的类型提升为较大的类型,比如double和int运算,int就会自动被提升为double
- 函数调用:当形参和实参的类型不匹配时,编译器会尝试进行自动类型转换,使函数能被正常调用
- 赋值操作:当变量的类型和赋值的类型不匹配时,编译器会尝试自动类型转换
带来的问题:精度丢失、类型不匹配导致的逻辑错误、性能问题、难以发现的程序错误
显式类型转换(如强制类型转换)有哪些风险?
显式类型转换(也叫做强制类型转换)是指程序员明确要求将一种类型的值转换为另一种类型。在 C++ 中,显式类型转换使用强制类型转换运算符 static_cast
、dynamic_cast
、const_cast
和 reinterpret_cast
。
风险:丢失精度、类型不匹配引起的问题、破坏类型安全、代码可读性和维护性差(看不懂代码)