反转/镜像二叉树。方法是不是保持输入树完整?

时间:2015-07-14 19:52:25

标签: java tree pass-by-reference

我是Java新手(只编程了一个月),所以我一直在练习一些概念。所以,如果这是一个天真或愚蠢的问题,请耐心等待我。我以前只在MATLAB中编程了!

我刚刚成功倒置了一棵二叉树(在我第一次尝试时也是如此!)。但是,我正在努力解决为什么我的方法实际上修改了我作为输入传递的树而不是保持完整并简单地返回一个倒置的变体。简而言之,在我的主函数中的以下行之后:

  

inverse = invertBinaryTree(root);

'inverse'和'root'都是相同的,它们是'root'的反转版本之前我将'root'传递给方法'invertBinaryTree'。拜托,我正在试图理解这种行为而失去理智!

事实上,我甚至尝试创建一个辅助方法'invertBinaryTree2',这个变体将输入复制到占位符节点,并在占位符节点而不是输入上操作;但是,这对事情没有帮助,我的意见仍然没有改变!

这是我的第一个具有支持功能的主要功能。尽管我将root复制到占位符变量,但invertBinaryTree和invertBinaryTree2的行为方式都相同!

public class leetCode_InvertBinaryTree {

public static void main(String[] args) {
    /*
     * initializing some binaryNodes for the tree
     */
    binaryNode a = new binaryNode(4);
    binaryNode b = new binaryNode(2);
    binaryNode c = new binaryNode(7);
    binaryNode d = new binaryNode(1);
    binaryNode e = new binaryNode(3);
    binaryNode f = new binaryNode(6);
    binaryNode g = new binaryNode(9);
    binaryNode inverse;

    /*
     * just building the tree
     */
    a.left = b;
    a.right = c;
    b.left = d;
    b.right = e;
    c.left = f;
    c.right = g;

    /*
     * Here is the issue!
     */
    System.out.println("Before inverting, root's left branch contains: " + a.left.data);
    inverse = invertBinaryTree(a);
    System.out.println("After inverting, root's left branch contains: " + a.left.data);
    System.out.println("After inverting, inverse's left branch contains: " + inverse.left.data);
}

public static binaryNode invertBinaryTree(binaryNode root){
    if(root.right == null && root.left == null){
        return root;
    }
    else if(root.right == null){
        root.right = root.left;
        root.left = null;
    }
    else if (root.left == null){
        root.left = root.right;
        root.right = null;
    }
    else {
        binaryNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
    root.left = invertBinaryTree(root.left);
    root.right = invertBinaryTree(root.right);
    return root;
}

public static binaryNode invertBinaryTree2(binaryNode root){
    binaryNode placeholder = root;
    if(placeholder.right == null && placeholder.left == null){
        return placeholder;
    }
    else if(placeholder.right == null){
        placeholder.right = placeholder.left;
        placeholder.left = null;
    }
    else if (placeholder.left == null){
        placeholder.left = placeholder.right;
        placeholder.right = null;
    }
    else {
        binaryNode temp = placeholder.left;
        placeholder.left = placeholder.right;
        placeholder.right = temp;
    }
    placeholder.left = invertBinaryTree(placeholder.left);
    placeholder.right = invertBinaryTree(placeholder.right);
    return root;
}

这不重要,但这里是binaryNode类,以防它帮助你。我还包括了上面发布的主要功能的输出。

  

在反转之前,root的左分支包含:2

     

反转后,root的左分支包含:7

     

反转后,反向左分支包含:7

public class binaryNode {

public int data;
public binaryNode left;
public binaryNode right;

/*
 * constructor for binaryNode
 */
public binaryNode(int d){
    data = d;
}}

1 个答案:

答案 0 :(得分:0)

我建议您添加更多调试语句(例如在println中),以在代码的每个阶段显示结构的状态。它将帮助说明代码正在做什么。

您遇到问题的原因是:

在这种方法中:

public static binaryNode invertBinaryTree(binaryNode root){

...您正在传递节点,指针(引用)到类binaryNode的对象。 **顺便说一句,大多数样式约定都要求你称之为BinaryNode(大写标准化)......

在binaryNode类中的这一行:

public binaryNode left;

...您将节点“left”声明为可由任何人修改的成员。该成员的类型为“binaryNode”,这意味着它引用了“binaryNode”类型的对象的地址。

在此代码中:

else if (root.left == null){
    root.left = root.right;

...您正在将名为“left”的字段设置为“right”返回的东西,该字段是binaryNode的地址,这是另一个binaryNode的地址。

......等等。您正在设置引用的值,因此正在更改数据结构的结构。