【问题标题】:Is there a better way to write this if-else block?有没有更好的方法来编写这个 if-else 块?
【发布时间】:2023-03-17 06:55:01
【问题描述】:

我正在为二叉搜索树编写一些代码,其中每个节点都有一个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;
}

有没有更简洁的方法来写这个(可能是单行)?我不确定是否可以在这里使用三元运算符语法,因为我在if 块中有parent.left = x,在else 块中有parent.right = x。我不喜欢这个函数中使用的所有这些if-else 块。

这里是完整的代码sn-p。

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;
    }
  }
};

【问题讨论】:

    标签: javascript if-statement binary-search-tree conditional-operator


    【解决方案1】:

    请试试这个。

    当你有类似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);
    }
    

    【讨论】:

      【解决方案2】:

      这是一个满足您标准的选项,尽管在风格方面我更喜欢您写的比这更好的:-)

      function chooseWhichToMakeNull(object, condition) {
        const field = condition ? 'left' : 'right';
        object[field] = null;
      }
      
      const obj = { left: 5, right: 10 };
      chooseWhichToMakeNull(obj, true);
      console.log(obj);

      【讨论】:

        【解决方案3】:

        除了使用parent.left = xparent.right = x 之外,您还可以将属性名称存储在一个变量中,然后改用parent[direction] = x

        对于您的特定情况,在 if 和 else 块中进行 parent.left === current 检查也有帮助。这意味着我们可以将它移到条件之外。

        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;
        

        【讨论】:

        • 太棒了。我不认为我会从 if (!a &amp;&amp; !b) 块跳转到您的 if-else if-else 块。谢谢!
        • @Espresso 对我来说,缩小一点,看看代码的意图是什么,而不是它当前正在做什么,这会有所帮助。我没有花太多力气解释为什么你可以做这一步,但我希望简化的例子表明,如果你先检查a,然后检查b,那么剩下的就是!a &amp;&amp; !b(这是否则)。
        • 是的,我认为退后一步会有很大帮助。一旦我用通用术语 ab 重写了我的代码并按照您的步骤操作,我就可以看到您是如何找到解决方案的。我会努力记住这一点,以备不时之需!再次感谢!
        猜你喜欢
        • 2022-06-19
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多