如何在 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 中反转二叉树?的主要内容,如果未能解决你的问题,请参考以下文章