假设我们有这棵树,我们将在深度2执行交换:
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);
}
}
当我在调用方法之前和之后运行上面的树的遍历遍历时,我得到相同的结果:
2 4 1 3 5
我应该
4 2 1 5 3
答案 0 :(得分:0)
我相信这就是你追求的目标,
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, sDepths, 0 )