javascript - 有没有更好的方法来编写这个 if-else 块?
问题描述
我正在为二进制搜索树编写一些代码,其中每个节点都有一个left
和一个right
子指针。在我的delete
函数中,我有以下代码。
if (!current.left && !current.right) {
if (parent.left === current) {
parent.left = null;
} else {
parent.right = null;
}
} else {
if (parent.left === current) {
parent.left = current.left ? current.left : current.right;
} else {
parent.right = current.left ? current.left : current.right;
}
}
两次我有一些具有以下语法的块:
if (someCondition) {
parent.left = x;
} else {
parent.right = x;
}
有没有更简洁的方法来写这个(也许是单行)?我不确定是否可以在这里使用三元运算符语法,因为我parent.left = x
在if
块中和块parent.right = x
中都有else
。我并不热衷if-else
于此功能中使用的所有这些块。
这是整个代码片段。
const getInOrderSuccessor = (root, node) => {
let successorParent = null;
let successor = null;
let previous = null;
let current = root;
while (current) {
if (node.value < current.value) {
successorParent = previous;
successor = current;
previous = current;
current = current.left;
} else {
previous = current;
current = current.right;
}
}
return [successor, successorParent];
};
const deleteNode = (root, value) => {
let current = root;
let parent = null;
while (current) {
if (value === current.value) break;
parent = current;
current = value < current.value ? current.left : current.right;
}
// If 2 child, deal with that first
if (current.left && current.right) {
const [successor, successorParent] = getInOrderSuccessor(root, current);
current.value = successor.value;
current = successor;
parent = successorParent;
}
if (!current.left && !current.right) {
if (parent.left === current) {
parent.left = null;
} else {
parent.right = null;
}
} else {
if (parent.left === current) {
parent.left = current.left ? current.left : current.right;
} else {
parent.right = current.left ? current.left : current.right;
}
}
};
解决方案
请试试这个。
每当你有类似的东西时,你应该用这样的运算符z = y?y:x
替换它
而且你也可以编写常见的条件。||
z = y || x
if (parent.left === current) {
parent.left = (!current.left && !current.right) ? null : (current.left || current.right);
} else {
parent.right = !(!current.left && !current.right) ? null : (current.left || current.right);
}
推荐阅读
- javascript - 最大子对象 React-native
- c++ - 初始化 constexpr -“用非常量表达式非法初始化 'constexpr' 实体”
- node.js - Knex 从时间列和日期列中获取格式化时间
- java - 无法在 JPanel Java 中编辑文本区域
- reactjs - 容器中的 React 组件和 redux 的表示组件的正确分离
- python - 使用 pipenv 与 setuptools 安装 python 应用程序
- sqlite - 使用 WHERE ... IN 进行多列选择
- jquery - 当我单击一个活动选项卡时,我希望全部出现。之后,当我单击我想要的选项卡时,我希望所有其他人都消失
- python - 我们如何填充列中的空值?
- c# - 为什么在 Swagger 上尝试 POST 时出现“错误内部服务器”错误?