我有一个简单的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;
如果您能指出正确的方向,我将不胜感激。
答案 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;
}