Java 交换二叉树中深度N处每个节点的子节点

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

假设我们有这棵树,我们将在深度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);
        }

    }
我应该去

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 );
}