镜像二叉树

时间:2019-03-20 15:23:03

标签: java tree

我有一个简单的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上调用此函数,则我希望从根开始,交换所有节点,直到到达没有更多子节点可交换的节点为止。我苦苦挣扎的部分是在交换了根节点子节点之后,我如何在这些节点上递归地调用mirror函数,然后返回镜像树。

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

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

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

3 个答案:

答案 0 :(得分:2)

您需要一个单独的方法来接受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);
    }
}      

答案 1 :(得分:0)

我想您也可以更改您的Node-class,以便它使用标志来反映行为:

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

答案 2 :(得分:0)

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