嘿,所以我想创建一个新树,它基本上是2个给定二叉搜索树的交集(交集的数学定义)。我有一个方法打印出树的特定级别的所有节点,我有一个方法可以找出树的深度。我到目前为止粘贴我的工作,虽然它是不完整的,我坚持使用logic.Help将不胜感激。
public static Bst<Customer> intersect (Bst<Customer> a, Bst<Customer> b){
Bst<Customer> result = new Bst<Customer>();
BTNode<Customer> cur1;
BTNode<Customer> cur2;
BTNode<Customer> cur3;
cur1=a.root;
cur2=b.root;
cur3=result.root;
int Resultdepth;
if(a.maxDepth()<b.maxDepth())
Resultdepth=a.maxDepth();
else
Resultdepth=b.maxDepth();
if(cur1==null || cur2==null){ // Handeling the root case intially
result = null;
}
else
cur3.item.set_account_id(cur1.item.get_accountid()+ cur2.item.get_accountid());
cur1=cur1.left;
cur2=cur2.left;
cur3=cur3.left;
while(<some check>){
}
return result;
}
public int maxDepth(){
return mD(root);
}
int mD(BTNode<E> node){
if (node==null) {
return(0);
}
else {
int lDepth = mD(node.left);
int rDepth = mD(node.right);
// use the larger + 1
return(Math.max(lDepth, rDepth) + 1);
}
}
// for printing the nodes at a particular level and giving the starting level
public void PrintAt(BTNode<E> cur, int level, int desiredLevel) {
if (cur == null) {
return;
}
if (level == desiredLevel) {
System.out.print(cur.item.toString() + "");
}
else {
PrintAt(cur.left, level+1, desiredLevel);
PrintAt(cur.right, level+1, desiredLevel);
}
}
答案 0 :(得分:3)
您必须同时遍历两棵树并且同步&#34;同步&#34;。
我建议为您的班级实施Iterable接口。然后你从两棵树中得到第一个值。如果它们相等,则将它放在新树中,并从两个迭代器中获取下一个值。如果没有,请使用较小的值迭代迭代器,直到获得的值至少与另一个迭代器的最后一个值一样大。冲洗并重复。
答案 1 :(得分:0)
两棵树的交集可能是两棵树中的节点?
鉴于您必须探索树来执行此操作,为什么不进行有序遍历,存储节点然后在有序列表上执行交叉操作?
答案 2 :(得分:0)
我对这种交集的建议很简单:
给定树A和树B,找到树C = A \相交B:
1:复制树A或B.为了清楚起见,我们假设A.
这个副本现在是你的树C.现在让我们“修剪”它
2:对于c = C.root_node和b = B.root_node:
如果b == c,
用节点b.left,c.left
重复该过程
用节点b.right,c.right
重复该过程
否则,
删除c(从而删除所有后续的孩子,暗示他们是不平等的)
如果这个实现可行,它将避免使用迭代器等,并归结为简单的递归遍历。 (Like this!)
询问您是否希望进一步澄清。
问候。
答案 3 :(得分:0)
对于查找两个二叉搜索树的交集的递归实现,我提出了以下代码。我不太确定时间的复杂性,但它确实可行。
void BST :: findIntersection(cell * root1,cell * root2){
if(root1 == NULL ) {
// cout<<"Tree 1 node is null , returning"<<endl;
return;
}
if(root2 == NULL) {
// cout<<"Tree 2 node is null , returning"<<endl;
return;
}
//cout<<"Comparing tree 1 : "<<root1->data<< " and tree 2 : " << root2->data<<endl;
if(root1->data==root2->data) {
// cout<<"tree 1 equal to tree 2 "<<endl;
insert(root1->data);
// cout<<"Inserting in new tree : "<<root1->data<<endl;
findIntersection(root1->left,root2->left);
findIntersection(root1->right, root2->right);
}
else if(root1->data>root2->data) {
// cout<<"tree 1 > tree 2 "<<endl;
findIntersection(root1,root2->right);
findIntersection(root1->left, root2);
}
else {
// cout<<"tree 1 < tree 2 "<<endl;
findIntersection(root1->right,root2);
findIntersection(root1, root2->left);
}
}