【问题标题】:Finding Cousins in binary search tree在二叉搜索树中查找表亲
【发布时间】:2015-06-24 18:16:03
【问题描述】:

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

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

但即使是表兄弟节点,我的 isCousins 函数也会给出 false。例如,在我在代码中创建的二叉树中,12 和 50 是表兄弟,但它仍然打印为 false。

这是我的源代码。

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;
 }
}

【问题讨论】:

  • 我一直在测试它:ideone.com/RRvSpf 似乎是在说它们处于同一水平,但它认为它们具有相同的父级(12、50)
  • 谢谢你!发现了错误。
  • 介意为其他人/我的好奇心发布它吗?
  • 如果它们的父节点具有相同的父节点,则节点是表兄弟。摆脱这个级别的业务会大大清理你的代码。
  • @erickson 但是这个crazyforcode.com/tree

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


【解决方案1】:

感谢 Patrick Murphy,由于小错误导致输出错误,我很容易使用以下内容进行纠正:

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

正确的代码是:

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;
         if(parent.get(key)==null)
         parent.put(key,x);
         return x;
     }
     else if(x.key>key)
     {
         x.left=insert(x.left,key);         
         x.left.parent=x;
         if(parent.get(key)==null)
         parent.put(key,x);
         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 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(66,75));
}
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;
}
} 
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】:

    节点不是原始类型,所以你不能有这样的代码:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2012-06-05
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多