简体   繁体   English

合并两个二叉树

[英]Merging two binary trees

I want to merge a tree with another tree, t. 我想将一棵树与另一棵树合并。 If there is overlapping data, I want to add them together. 如果有重叠的数据,我想将它们加在一起。 This is my code right now. 这是我的代码。 I don't understand how to do this merge function with only parameter t. 我不明白如何仅使用参数t来执行此合并功能。 Doesn't merge usually have two parameters? 通常不合并有两个参数吗?

public class TreeFunctions {

   private TreeNode root;

   public TreeFunctions(TreeNode root) {
        this.root = root;
   }

   public TreeNode merge(TreeNode t) {
        TreeNode curr = this.root;
        if (curr == null) {
            return t;
        }

        if (t == null) {
            return curr;
        }

        curr.data += t.data;
        curr.left = merge(t.left);
        curr.right = merge(t.right);
        return curr;
   }
}

public class TreeNode{
    TreeNode left;
    TreeNode right;
    int data;

    public TreeNode(int data) {
        this.data = data;
    }
    public TreeNode(int data, TreeNode left, TreeNode right) {
        this.data = data;
        this.left = left;
        this.right = right;
    }

    public static String inOrder(TreeNode a) {
        if(a == null) return "";
        else return inOrder(a.left).trim() + " " + a.data + " " + inOrder(a.right).trim();
    }
}

EDIT My tests for merge: 编辑我的合并测试:

public void testMerge2() {
        TreeFunctions c = new TreeFunctions(new TreeNode(5, new TreeNode(2), null));
        TreeNode d = new TreeNode(2, new TreeNode(2), new TreeNode(1));
        TreeNode res2 = c.merge(d);
        assertEquals(TreeNode.inOrder(res2).trim(), "4 7 1");
    }

public void testMerge3() {
        TreeFunctions c = new TreeFunctions(new TreeNode(5, new TreeNode(2), null));
        TreeNode res2 = c.merge(null);
        assertEquals(TreeNode.inOrder(res2).trim(), "2 5");
    }

public void testMerge4() {
        TreeFunctions c = new TreeFunctions(new TreeNode(1, new TreeNode(2, new TreeNode(5), null), null));
        TreeNode res2 = c.merge(new TreeNode(1, null, new TreeNode(2, null, new TreeNode(5))));
        assertEquals(TreeNode.inOrder(res2).trim(), "5 2 2 2 5");
    }

I've edited my answer per your responses. 我已经根据您的回答修改了答案。 I believe this is what you want.Please try it and let me know. 我相信这就是您想要的。请尝试并让我知道。

In the code, function goes down one level for both t1 and t2 so that merge always takes place on the same level and the same side (left-left/right-right). 在代码中,函数针对t1和t2下降了一层,因此合并总是在同一层和同一侧(左-左/右-右)进行。

 public TreeNode merge(TreeNode t) {
        TreeNode curr = this.root; 
        merge2(curr,t);
        return curr;
   }
   public  void merge2(TreeNode t1,TreeNode t2) {
        if(t2==null)
            return;
        t1.data += t2.data;
        if(t2.left!=null)
        {
            if(t1.left==null)
                t1.left = new TreeNode(0);
            merge2(t1.left,t2.left);
        }
        if(t2.right!=null)
        {
            if(t1.right==null)
                t1.right = new TreeNode(0);
            merge2(t1.right,t2.right);
        }

   }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM