如何在 JavaScript 中反转二叉树?

Posted

技术标签:

【中文标题】如何在 JavaScript 中反转二叉树?【英文标题】:How can I invert a binary tree in 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) 
    
;

【问题讨论】:

[root.left, root.right] = [root.right, root.left] 然后为孩子做同样的事情 只需将左节点与右节点交换,试试我的二叉树类,它带有构建它的函数 reverse()。参考链接 - 类 - npmjs.com/package/@dsinjs/binary-tree 文档 - dsinjs.github.io/binary-tree/#reverse 【参考方案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))

【讨论】:

以上是关于如何在 JavaScript 中反转二叉树?的主要内容,如果未能解决你的问题,请参考以下文章

反转二叉树(从左到右)[关闭]

在 C++ 中反转二叉树

DS二叉树—二叉树镜面反转

需要帮助跟踪二叉树的这种反转方法

二叉树的镜像(反转二叉树)

十三:反转二叉树