الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Binary tree

بدأه العصر الذهبي في 21 مايو 2011 · 12 رد · 975 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

أود الاستفسار إن تكرمتم

أريد بناء Family tree بواسطة الـ Binary tree بشكل مبسط

صالح هو الجد الأكبر - لديه ابنان (أحمد ومحمد ) ولدى محمد ثلاث ابناء(سامي وعلي وعمر)

لا أعلم ماهي المشكلة؟

هذا الكود الذي اعمل عليه

public class BinaryTree {

public static void main(String[] args) {
 new BinaryTree().run();
 }

 static class Node 
{

 Node left;
 Node right;
 String value;

 public Node(String value) {
 this.value = value;
 }
 }

 public void run() {
 Node rootnode = new Node("Saleh");
 System.out.println("Building tree with rootvalue " + rootnode.value);
 System.out.println("=================================");
 insert(rootnode, "Ahmad");
 insert(rootnode, "Mohammad");
 insert(rootnode, "Ali");
 insert(rootnode, "Sami");
 insert(rootnode, "Omar");
 System.out.println("Traversing tree in order");
 System.out.println("=================================");
 printInOrder(rootnode);

 }

 public void insert(Node node, String value) {
 if (value < node.value) {
 if (node.left != null) {
 insert(node.left, value);
 } else {
 System.out.println(" Inserted " + value + " to left of node " + node.value);
 node.left = new Node(value);
 }
 } else if (value > node.value) {
 if (node.right != null) {
 insert(node.right, value);
 } else {
 System.out.println(" Inserted " + value + " to right of node " + node.value);
 node.right = new Node(value);
 }
 }
 }

 public void printInOrder(Node node) {
 if (node != null) {
 printInOrder(node.left);
 System.out.println(" Traversed " + node.value);
 printInOrder(node.right);
 }
 }
 }

أرشدوني وجزاكم الله خيرا

#2

معاك مشكله في مقارنة الاسترينغ هنا

value < node.value

لا يوجدoperator overloading في الجافا

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3

^

هل من الممكن التوضيح كيفية المقارنة الصحيحة؟

وأيهما الأصح في شجرة العائلة برمجيا ، أضع الابن في اليسار أو اليمين حسب أول حرف من اسمه أو حسب عمره ؟

#4

حول value الى int

هكذا مثلا

 if Integer.parseInt(value)>Integer.parseInt(node.value)

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#5

لكن جربت هذه الطريقة ولاتعمل لأن الشجرة مكونة من أسماء وليست أرقام

وشكر الله لك

#6

للمقارنة من حيث التشابهة الستخدمي كالتالي:

اذا كان 0 فأنهم متساويين من ناحية التراكيب

اذا اكبر من 0 فأن النص الاول اكبر من ناحية معجمية

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
  // this line WILL print
  System.out.println("The two strings are the same.")
}

---

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)

#7

اسف لم الاحظ ، كنت اعتقد ان value تحوي العمر وليس الاسم

اذا لازال بامكاني مساعدتك : هل يمكن ان تقول لي ماهو اساس المقارنه او ماهو منطق المقارنه؟

تم تعديل هذه المشاركة بواسطة mental-driller في 22 مايو 2011 في 03:49

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#8

شكر الله لك نعم أحتاج للمساعدة

السؤال الذي طلب مني هو إنشاء شجرة العائلة ( لأجداد شخص ما مثلا)

أنا لازلت أجهل كيف يمكن أن أعمل إضافة أو حذف وماهو أساس المقارنة

إذا امكن بتزويدي بأفكار حول الطرق التي يمكن بها المقارنة في شجرة العائلة

وجزيتم خيرا

#9

أظن من الأفضل عمل override للطريقة equals في Node، والمقارنة بين الإسم و left و right، لأنه يمكن أن يكون عدة أشخاص لهم نفس الإسم لكنهم مختلفون.

أيضا أليس من الأفضل إضافة ال parent إلى Node؟؟

اقتباس
ولدى محمد ثلاث ابناء(سامي وعلي وعمر)

لست جيدا في ال Data structure، لكن أليس من المفروض أن يكون هناك فقط two child nodes في Binary Tree

تم تعديل هذه المشاركة بواسطة herch في 24 مايو 2011 في 11:07

#10
herch كتب:

أظن من الأفضل عمل override للطريقة equals في Node، والمقارنة بين الإسم و left و right، لأنه يمكن أن يكون عدة أشخاص لهم نفس الإسم لكنهم مختلفون.

أيضا أليس من الأفضل إضافة ال parent إلى Node؟؟

لست جيدا في ال Data structure، لكن أليس من المفروض أن يكون هناك فقط two child nodes في Binary Tree

المشكلة الان

كيف استطيع أن أضيف النود وداخلها كلمة وليس رقما لأنه لم تنجح معي طريقة لعملها

#11

اذا كان الاب يستطيع ان يملك اكثر من ابنين (اكثر من 2 Sub-Node) عندها عليك باستخدام Hashtable لتجميعهم (او ArrayList )

اما اذا كان فقط 2 Nodes عندها يمكن الاشارة لهم مثلا LeftNode, RightNode او FirstNode, SecondNode

#12

عملت هذا الكود ولكن لا اعرف ان كان يفيدك

import java.util.Hashtable;

/**
 *
 * @author MErsan
 */
public class Node {

    private String name;
    private Hashtable<String, Node> childrens;
    private Node parent;

    public Node(String name) {
        this.name = name;
    }

    public Node() {
        this.name = "";
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    public void addChildren(Node node) {
        node.parent = this;
        if (childrens == null) {
            childrens = new Hashtable<String, Node>();
        }
        childrens.put(node.getName(), node);
        System.out.println("Child Added To " + getName() + " ,With Name :" + node.getName());
    }

    /**
     * @return the childrens
     */
    public Hashtable<String, Node> getChildrens() {
        return childrens;
    }

    /**
     * @param childrens the childrens to set
     */
    public void setChildrens(Hashtable<String, Node> childrens) {
        this.childrens = childrens;
    }

    /**
     * @return the parent
     */
    public Node getParent() {
        return parent;
    }

    public Node getChildByName(String name) {
        return childrens.get(name);
    }

    public void printChildrens() {
        if (childrens == null) {
            System.out.println(getName() + " Has No Childrens.");
        } else {
            System.out.println(getName() + " Childrens: ");
            for (Node n : childrens.values()) {
                System.out.println("- " + n.getName());
            }
        }
    }

    public void printAll() {

        if (childrens != null) {
            System.out.println("\n" + getName() + " Childrens: ");
            for (Node n : childrens.values()) {
                if (n.getChildrens() == null) {
                    System.out.println("- " + n.getName());
                }
                n.printAll();

            }
        }
    }
}

public class NodeTestMain {

    public static void main(String[] args) {
        Node rootNode = new Node("Root");
        rootNode.addChildren(new Node("Father1"));
        rootNode.addChildren(new Node("Father2"));
        rootNode.addChildren(new Node("Father3"));

        rootNode.getChildByName("Father1").addChildren(new Node("Child1"));
        rootNode.getChildByName("Father1").addChildren(new Node("Child2"));
        rootNode.getChildByName("Father1").addChildren(new Node("Child3"));
        rootNode.getChildByName("Father1").addChildren(new Node("Child4"));

        rootNode.getChildByName("Father2").addChildren(new Node("Child1"));
        rootNode.getChildByName("Father2").addChildren(new Node("Child2"));
        rootNode.getChildByName("Father2").addChildren(new Node("Child3"));
        rootNode.getChildByName("Father2").addChildren(new Node("Child4"));

        rootNode.getChildByName("Father3").addChildren(new Node("Child1"));
        rootNode.getChildByName("Father3").addChildren(new Node("Child2"));
        rootNode.getChildByName("Father3").addChildren(new Node("Child3"));
        rootNode.getChildByName("Father3").addChildren(new Node("Child4"));

        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity1"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity2"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity3"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity4"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity5"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity6"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity7"));
        rootNode.getChildByName("Father3").getChildByName("Child1").addChildren(new Node("Infinity8"));

//        rootNode.printChildrens();
        System.out.println("////////////////////////////////");
        rootNode.printAll();

    }
}
#13

اخي جزاك الله خيرا

فهل تستطيع إرشادي كيف أعمل كود يقوم بأخذ اسم الشخص من المستخدم ويقوم بإضافته لوالد معين في الشجرة

مثلا لو كان عندي شجرة فيها أب وله ابن واحد ، واردت أن اضيف الابن الثاني لهذا الأب عن طريق المستخدم كيف اقوم بذلك

تم تعديل هذه المشاركة بواسطة العصر الذهبي في 26 مايو 2011 في 08:54

مواضيع مشابهة