Java 交换二叉树中深度N处每个节点的子节点
假设我们有这棵树,我们将在深度2执行交换:Java 交换二叉树中深度N处每个节点的子节点,java,recursion,binary-tree,Java,Recursion,Binary Tree,假设我们有这棵树,我们将在深度2执行交换: 1 1 / \ / \ 2 3 [s] -> 2 3 \ \ / / 4 5 4 5 我正在尝试编写一个函数,它可以: public void swap(TreeNode node, int[] swaps, int i, int arraySize, int d
1 1
/ \ / \
2 3 [s] -> 2 3
\ \ / /
4 5 4 5
我正在尝试编写一个函数,它可以:
public void swap(TreeNode node, int[] swaps, int i, int arraySize, int depth) {
if(arraySize == 0) return;
if(depth < swaps[i]) {
swap(node, swaps, i+1, arraySize-1, depth+1);
}
if(depth == swaps[i]) {
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
swap(node.left, swaps, i+1, arraySize-1, depth+1);
swap(node.right, swaps, i+1, arraySize-1, depth+1);
}
}
我应该去
4 2 1 5 3
我相信这就是你想要的
public void swap( TreeNode node, int depth, int[ ] sDepths, int sI ) {
if( node == null || sI >= sDepths.length ) return;
if( depth == sDepths[ sI ] ) {
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
sI++;
}
swap( node.left, depth + 1, sDepths, sI );
swap( node.right, depth + 1, sDepths, sI );
}
说明:
首先,它验证了我们没有离开树,还有更多的交换需要执行。然后检查当前深度是否需要交换。如果是这样,我们交换索引并将其增量到交换数组中。然后我们在孩子们身上重复
这要求
sDepth
的顺序是递增的,初始调用类似于swap(root,0,sDepth,0)
好的,现在我更好地理解了你前面的问题。但是还有一个问题,swaps
array中有什么?@Smith_61 hey:)可能涉及多个swaps,所有不同的深度都存储在该数组中。在这个特定的例子中:数组将只包含2。好的,swaps
数组包含所有您想要交换的不同级别。所以,如果你想交换,比如说第2、4、7级,它只会包含那些按递增顺序排列的数字?@Smith_61是的。这是正确的,谢谢你的努力,但这给了我与我得到的相同的答案:2 4 1 3 5
我在这里使用了零索引,所以根是一个深度0,在深度1处有根。您需要在起始深度中添加一个,或从每个分割深度中减量1
public void swap( TreeNode node, int depth, int[ ] sDepths, int sI ) {
if( node == null || sI >= sDepths.length ) return;
if( depth == sDepths[ sI ] ) {
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
sI++;
}
swap( node.left, depth + 1, sDepths, sI );
swap( node.right, depth + 1, sDepths, sI );
}