重复翻转二叉树

时间:2016-04-22 03:07:04

标签: java recursion binary-tree

我有这个家庭作业,我需要翻转二叉树。 我不是在寻找代码或任何东西,只是提示为什么我的方法不起作用。

以下是我的代码。当我单步执行它时,它似乎工作正常,翻转每个左右节点,并递归地移动树。 但是,似乎在返回时,它返回一个具有零左右值的节点,原始节点(根)除外。

public class TreeManipulator<E> {

    public TreeManipulator() {
    }

    public BinaryNode<E> flipTree(BinaryNode<E> _root) {

        BinaryNode<E> root = new BinaryNode<>(_root.getItem());

        if (_root.getLeft() != null) {
            root.setRight(new BinaryNode<>(_root.getLeft().getItem()));
            this.flipTree(_root.getLeft());
        }

        if (_root.getRight() != null) {
            root.setLeft(new BinaryNode<>(_root.getRight().getItem()));
            this.flipTree(_root.getRight());
        }

        return root;
    }
}

这是主要方法:

public static void main(String[] args) {
    Integer one = 1;
    Integer two = 2;
    Integer three = 3;
    Integer four = 4;
    Integer five = 5;
    Integer six = 6;
    Integer seven = 7;
    Integer eight = 8;

    //Root Node = x
    BinaryNode<Integer> x = new BinaryNode<>(one);

    //X.getLeft = y
    BinaryNode<Integer> y;

     //X.getRight = z
    BinaryNode<Integer> z;

    x.setLeft(new BinaryNode<>(two));
    x.getLeft().setLeft(new BinaryNode<>(six));
    x.getLeft().setRight(new BinaryNode<>(seven));

    x.setRight(new BinaryNode<>(three));
    x.getRight().setRight(new BinaryNode<>(four));
    x.getRight().setLeft(new BinaryNode<>(five));

    //Set root children for easier access
    z = x.getRight();
    y = x.getLeft();

    System.out.println(x.toStringPreorder());

    //Create tree manipulator
    TreeManipulator flop = new TreeManipulator();

    BinaryNode<Integer> flipped = flop.flipTree(x);

    System.out.println(flipped.toStringPreorder());       
}

如果你需要班级'BinaryNode',请问,我发帖,我不想用代码交换问题......

输入:

  • 输入 = [ 1267354 ]

预期产出:

  • 原始树 = [ 1267354 ]

  • 翻转后 = [ 1345276 ]

我的输出:

  • 翻转后 - '[132]'

我无法弄清楚为什么节点'2'和'3'返回左值和右值。

1 个答案:

答案 0 :(得分:2)

您使用错误的递归,flipTree不会翻转您放入的对象,它会返回原始输入的翻转副本。更重要的是,你甚至不把这个输入作为根的子节点,你只需要一个只包含值的节点,这就是为什么你只得到一个深度为1的树。

这应解决问题:

public BinaryNode<E> flipTree(BinaryNode<E> _root) {
    BinaryNode<E> root = new BinaryNode<>(_root.getItem());
    if (_root.getLeft() != null) {
        root.setRight(flipTree(_root.getLeft());
    }
    if (_root.getRight() != null) {
        root.setLeft(flipTree(_root.getRight());
    }
    return root;
}

如果您确实希望flipTree只是翻转树本身而不是返回翻转版本,那么您必须执行以下操作:

public void flipTree(BinaryNode<E> root) {
    BinaryNode<E> temp = root.getLeft();
    root.setLeft(root.getRight());
    root.setRight(temp);
    if (root.getLeft() != null) {
        flipTree(root.getLeft());
    }
    if (root.getRight() != null) {
        flipTree(root.getRight());
    }
}
是的,我知道你说你不是在寻找代码但是提示但是你的原始代码已经非常接近了,如果没有立即修复代码就很难给出一个提示。