在二叉树中交换深度为N的每个节点的子节点

时间:2015-05-01 19:12:09

标签: 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 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

1 个答案:

答案 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 )