在二叉搜索树中查找堂兄弟

时间:2015-06-24 18:16:04

标签: java binary-tree breadth-first-search

在二叉树中,如果两个节点位于同一级别并且它们具有不同的父节点,则它们是堂兄弟。

为此,在二叉搜索树中,我使用树图将每个键与一个级别相关联,并且还使用树图与父级的每个键相关联。然后我在root上调用BFS,它设置各种键的级别。

但我的isCousins函数即使对于表兄弟的节点也是假的。例如在我的代码中创建的二叉树中,12和50是表兄弟,但仍然是打印错误。

这是我的源代码。

import java.util.*;
class BST
{
 Node root;
 LinkedList<Node> q=new LinkedList<Node>();
 TreeMap<Integer,Integer> level=new TreeMap<Integer,Integer>(); 
 TreeMap<Integer,Node> parent=new TreeMap<Integer,Node>(); 
 Node insert(Node x,int key)
 {
     if(x==null)
     {
         parent.put(key,null);
         return new Node(key,null,null,null);
     }
     else if(x.key<key)
     {
         x.right=insert(x.right,key);
         x.right.parent=x;
         parent.put(key,x.right.parent);
         return x;
     }
     else if(x.key>key)
     {
         x.left=insert(x.left,key);         
         x.left.parent=x;
         parent.put(key,x.left.parent);
         return x;
     }
     else { x.key=key; return x;}
 }
 public void BFS(Node r)
 {
     if(r==null)
      return;
     if(r.parent==null)
      level.put(r.key,0);
     else level.put(r.key,level.get(r.parent.key)+1);     
     q.add(r);

     while(q.size()!=0)
     {
        Node n=q.poll();
        BFS(n.left);
        BFS(n.right);
     }
 } 
public boolean isCousins(int a,int b)
{
 BFS(root);
 if(level.get(a)==level.get(b)&&parent.get(a)!=parent.get(b))
  return true;
 else return false;
}
public static void main(String []args)
 {
     BST tree1=new BST();
     tree1.root=null;
     tree1.root=tree1.insert(tree1.root,15);
     tree1.root=tree1.insert(tree1.root,66);
     tree1.root=tree1.insert(tree1.root,5);
     tree1.root=tree1.insert(tree1.root,3);
     tree1.root=tree1.insert(tree1.root,12);
     tree1.root=tree1.insert(tree1.root,75);
     tree1.root=tree1.insert(tree1.root,50);     
     System.out.println(tree1.isCousins(12,50));
 }
} 
class Node
{
 Node left,right,parent;
 int key;
 int level;
 Node(int k,Node l,Node r,Node p)
 {
     key=k;
     left=l;
     right=r;
     parent=p;
 }
}

2 个答案:

答案 0 :(得分:2)

由帕特里克·墨菲(Patrick Murphy)提供,由于小错误导致输出错误,我很容易通过以下方式纠正:

if(parent.get(key)== null)

正确的代码是:

func canDrink(age: Int?, country: String) -> Bool {
    switch (age, country) {
    case (.Some, _) where age < 5: // We now know that `age` is some value
        return false
    default:
        return true
    }
}

canDrink(15,"UK")  // Returns true
canDrink(4,"UK")   // Returns false
canDrink(nil,"UK") // Now returns true, since this is a `.None` age

答案 1 :(得分:-2)

节点不是基本类型,因此您不能拥有以下内容的代码:

parent.get(a)!=parent.get(b);

使用基元运算符来比较非基元类型只是比较对象引用,而不是对象本身的实际内容。相反,写一下:

!parent.get(a).equals(parent.get(b));

由于TreeMap级别的值是Integer而不是int,因此不应将它们与==进行比较。相反,再次使用.equals()方法。

level.get(a).equals(level.get(b));

此外,

level.get(a).equals(level.get(b))&&!parent.get(a).equals(parent.get(b));

是一个布尔语句,所以你可以放

return level.get(a).equals(level.get(b))&&!parent.get(a).equals(parent.get(b));

而不是

if(level.get(a).equals(level.get(b))&&!parent.get(a).equals(parent.get(b)))
   return true;
return false;