【问题标题】:Swap childs of every node at depth N in a binary tree在二叉树中交换深度为 N 的每个节点的子节点
【发布时间】:2015-05-02 03:42:07
【问题描述】:

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

【问题讨论】:

  • 好的,现在我更好地理解了您之前的问题。但还有一个问题,swaps 数组中有什么?
  • @Smith_61 嘿嘿 :) 它可能涉及多个交换,并且所有不同的深度都存储在该数组中。在该特定示例中:该数组将仅包含 2.
  • 好的,swaps 数组包含了您想要交换的所有不同级别。所以如果你想交换,比如第 2、4、7 级,它会只包含那些按升序排列的数字吗?
  • @Smith_61 是的。没错

标签: java recursion binary-tree


【解决方案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 );
}

解释:

首先它验证我们没有离开树并且还有更多的交换要执行。然后它检查是否需要交换当前深度。如果是,我们交换并将索引增加到交换数组中。然后我们重复它的孩子。

这要求sDepth按递增顺序排列,初始调用类似于swap( root, 0, sDepths, 0 )

【讨论】:

  • 感谢您的努力,但这给了我相同的答案:2 4 1 3 5
  • 我在这里使用了零索引,所以根是深度为零的深度 1 处的根。您需要在起始深度上加一或从每个分割深度减一跨度>
猜你喜欢
  • 2020-07-19
  • 2021-01-02
  • 2020-10-24
  • 1970-01-01
  • 2011-06-20
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多