【问题标题】:How can I invert a binary tree in JavaScript?如何在 JavaScript 中反转二叉树?
【发布时间】:2020-11-07 07:04:49
【问题描述】:

如何翻转二叉树?我最近遇到了这个问题,我所有的尝试都失败了。初始树如下所示。

     4
   /   \
  2     7
 / \   / \
1   3 6   9

     4
   /   \
  7     2
 / \   / \
9   6 3   1
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
    
};

【问题讨论】:

标签: javascript algorithm tree binary


【解决方案1】:

对于每个至少有一个子节点的节点,您可以通过使节点的 .left 值等于节点的 .right 值,并且节点的 .right 值等于(旧的).left 来交换其子节点价值。交换子节点后,您可以通过递归调用 invertTree() 函数来查看是否必须对以子节点为根的子树执行相同的过程。如果一个节点既没有左子也没有右子,那么你就在叶子上,这意味着你可以返回传入的节点(因为不需要进一步的子交换)。

function Node(val, left, right) {
  this.val = (val===undefined ? 0 : val);
  this.left = (left===undefined ? null : left);
  this.right = (right===undefined ? null : right);
}

const invertTree = function(root) {
  if(!root || !root.left && !root.right) { // base case
    return root;
  }
  
  const oldLeft = root.left;
  root.left = root.right;
  root.right = oldLeft;
  invertTree(root.left);
  invertTree(root.right);
  return root;
};


const tree = new Node(4, new Node(2, new Node(1), new Node(3)), new Node(7, new Node(6), new Node(9)));
console.log(invertTree(tree));

【讨论】:

    【解决方案2】:

    使用 DFS(深度优先搜索)在 js 中使用递归方法会更容易,并且只需交换节点

        const trav = (currNode) => {
          if (currNode === null) {
            return;
          }
          const temp = currNode.lNode;
          currNode.lNode = currNode.rNode;
          currNode.rNode = temp;
          trav(currNode.lNode);
          trav(currNode.rNode);
        };
        trav(root);
        return root;
    

    更多有趣的方法请参考我写的类 -
    班级 - https://www.npmjs.com/package/@dsinjs/binary-tree
    reverse() 方法的文档 - https://dsinjs.github.io/binary-tree/#reverse

    【讨论】:

      【解决方案3】:

      你可以通过树递归,改变它,如果它们存在左右交换的话。

      const invertTree = tree => {
          if (!(tree?.left && tree?.right)) {
              return tree
          }
      
          [tree.right, tree.left] = [invertTree(tree.left), invertTree(tree.right)]
      }
      

      【讨论】:

        【解决方案4】:

        我这样解决了这个问题。试试这个算法。 我知道已经晚了,但它会帮助别人

         const node = {
            value: 1,
            left: {
              value: 2,
              left: { value: 4  },
               right: { value: 5  }   
            },
            right: {
               value: 3,
               left: { value: 6},
               right: { value: 7  }
            }
         }
        
        invertFree = (node) => {
            if (node) {
                const newNode = { value: node.value }
                if (node.right) {
                    newNode.left = invertFree(node.right)
                }
                if (node.left) {
                   newNode.right = invertFree(node.left)
                }
                return newNode
            }
        }
        
        console.log(invertFree(node))

        【讨论】:

          猜你喜欢
          • 2021-12-04
          • 2019-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多