首页 > 解决方案 > 有没有更好的方法来编写这个 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 = xif块中和块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;
    }
  }
};

标签: javascriptif-statementbinary-search-treeconditional-operator

解决方案


请试试这个。

每当你有类似的东西时,你应该用这样的运算符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);
}

推荐阅读