【问题标题】:Mirror a binary tree镜像二叉树
【发布时间】:2019-03-20 15:23:02
【问题描述】:

我有一个简单的 Node 类来在我的二叉树中构造一个树节点:

class Node {
    int data;
    Node left;
    Node right;

    public Node(int i) {
        this.data = i;
    }
}

我编写了一个简单的 Tree 类,它将使用 Node 结构来构建一棵树:

class Tree {
    Node root;
}

我正在尝试在我的 Tree 类中编写一个递归函数 mirror(),它将返回树的镜像版本(左右节点交换)。

因此,如果我在 Tree t 上调用此函数,我希望从根开始,并交换所有节点,直到我们到达一个没有更多子节点可交换的节点。我正在苦苦挣扎的部分是在我们交换了根节点子节点之后,我如何在这些节点上递归调用镜像函数,然后返回镜像树。

如您所见,下面的代码将交换根节点的子节点,但之后我被卡住了,因为我无法在节点上调用镜像函数,只能调用树。

public Tree mirror() {
    Node temp = this.root.left;
    this.root.left = this.root.right;
    this.root.right = temp;

如果您能指出正确的方向,我将不胜感激。

【问题讨论】:

  • 你不能只从右到左而不是从左到右遍历你的树吗?使用同一棵树,您可以通过 ASC 或 DESC 遍历它。
  • 你应该让镜像方法接受一个节点,而不是整个树。这样,您可以在左右元素上递归调用它。
  • 提示:您必须以递归方式执行此操作(将节点作为参数传递给函数)或迭代执行(使用堆栈)
  • @ClaudiuGuja 我会这样做,但是如果我想简单地调用 tree.mirror() 来获取镜像树呢?如果它接受一个节点,那么我必须调用 mirror(node) 这似乎很乏味,因为我必须创建一个新的节点对象

标签: java tree


【解决方案1】:

您需要一个单独的方法来接受Node 对象,镜像其子对象并递归调用自身。

public Tree mirror() {
    mirrorInternal(this.root);
    return this;
}

private void mirrorInternal(Node node) {
    Node tmp = node.left;
    node.left = node.right;
    node.right = tmp;
    if (node.left != null) {
        mirrorInternal(node.left);
    }
    if (node.right != null) {
        mirrorInternal(node.right);
    }
}      

【讨论】:

  • 这是有道理的。这是处理此类事情的最有效方法吗?不能用一种方法完成吗?
  • @juyebgastro 这是最简单的方法。由于这将是一个需要接受不同类型对象的单一方法,因此在这种情况下可能需要额外的编码。
【解决方案2】:

我想您也可以更改您的节点类,使其使用镜像行为的标志:

class Node {
    int data;
    Node[] children;

    public Node(int i) {
        this.data = i;
        this.children = new Node[2];
    }

    public void setLeft(Node node) {
        children[0] = node;
    }

    public void setRight(Node node) {
        children[1] = node;
    }

    public Node getLeft(boolean mirrored) {
        return mirrored ? children[1] : children[0];
    }

    public Node getRight(boolean mirrored) {
        return mirrored ? children[0] : children[1];
    }
}

【讨论】:

    【解决方案3】:
    void mirror (Tree tree) {
      mirror (tree.root);
    }
    
    Node mirror (Node node) {
      if (node != null) {
        Node temp = node.left;
        node.left = mirror (node.right);
        node.right = mirror (temp);
      }
      return node;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2021-08-24
      • 2020-03-16
      相关资源
      最近更新 更多