我正在為二叉搜索樹撰寫一些代碼,其中每個節點都有一個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;
}
}
};
uj5u.com熱心網友回復:
請試試這個。
每當你有類似的東西時,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);
}
uj5u.com熱心網友回復:
而不是使用parent.left = x和parent.right = x,你可以在一個變數存盤屬性名稱,并使用parent[direction] = x來代替。
對于您的特定場景,parent.left === current在 if 和 else 塊中進行檢查也有幫助。這意味著我們可以將它移到條件之外。
const direction = parent.left === current ? "left" : "right";
if (!current.left && !current.right) {
parent[direction] = null;
} else {
parent[direction] = current.left ? current.left : current.right;
}
您可以通過重新設計邏輯來進一步簡化此操作。
if (!a && !b) {
variable = null;
} else {
variable = a ? a : b;
}
可以改成:
if (a) {
variable = a;
} else if (b) {
variable = b;
} else {
variable = null;
}
也可以寫成:
variable = a || b || null;
導致以下解決方案:
const direction = parent.left === current ? "left" : "right";
parent[direction] = current.left || current.right || null;
uj5u.com熱心網友回復:
這是一個滿足您標準的選項,盡管從風格上講,我喜歡您寫的比這更好的內容:-)
function chooseWhichToMakeNull(object, condition) {
const field = condition ? 'left' : 'right';
object[field] = null;
}
const obj = { left: 5, right: 10 };
chooseWhichToMakeNull(obj, true);
console.log(obj);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316339.html
標籤:javascript if 语句 二叉搜索树 条件运算符
