سؤال

يقوم برنامج C ++ بإنشاء شجرة بحث ثنائية. أنا أعرف كيفية طباعة القيم في النظام المسبق، بعد الترتيب، والترتيب.

ومع ذلك، أريد أن أفعل شيئا أكثر صعوبة قليلا. أريد طباعة القيم بالطريقة التي سيتطلعون فيها إذا قام شخص ما بوجه الشجرة على الورق. سيكون له الجذر في المركز في الأعلى، إنه يغادر الطفل مباشرة بموجب يسارها، وهو طفل صحيح مباشرة بموجب الحق وفي ذلك. سيتم استخلاص بقية العقد وفقا لذلك.

كيف أقوم بذلك؟

هل كانت مفيدة؟

المحلول

هذه المقالة يحتوي على رمز لما تحتاجه، يبدو:

نص Alt http://www.cpp-programming.net/wp-content/uploads/2007/12/ascii_tree.jpg.

تحرير: ذهب هذا الموقع دون اتصال

هنا واحدة أخرى استكشاف بعض الخيارات الأخرى.

نصائح أخرى

إليك شفرة الزائفة التقريبية للقيام بذلك. الفكرة الأساسية تمشي طبقة شجرة الشجرة، وطباعة كل العقدة في كل طبقة على سطر واحد. يتم فصل كل عقدة بمقدار ضعف مساحة مثل العقد الموجودة أسفلها. نظرا لأن الشجرة ليست كلها بعمق موحد، فإنه مبطن مصطنع مع العقد الافتراضية لتناول المساحات الفارغة حيث لا توجد العقد.

measure the depth of the tree, call that D
have two queues, called Q1 and Q2
enque the top node of the tree in Q1
for (i = D; --i>=0; ){
  foreach node in Q1 {

    on first iteration of this inner loop, print 2^i - 1 spaces,
    else print 2^(i+1) - 1 spaces.

    if node == null print blank
    else print node.value

    if node.left exists enque node.left in Q2
    else enque null in Q2

    if node.right exists enque node.right in Q2
    else enque null in Q2
  }
  copy Q2 to Q1
  clear Q2
  print end-of-line
}

كل مساحة مطبوعة هي عرض حقل رقمي واحد. لنفترض أن الشجرة لديها عمق D = 4. ثم تطور الطباعة مثل هذا:

// it looks like this, and the space sequences are
i = 3: -------n 7
i = 2: ---n-------n 3 7
i = 1: -n---n---n---n 1 3 3 3
i = 0: n-n-n-n-n-n-n-n 0 1 1 1 1 1 1 1

طريقة واحدة هي استخدام Graphviz. على وجه التحديد، استخدم برنامج "DOT" الخاص به، ولكن الحصول على الإخراج للنظر بالضبط كما تصفه قد لا يكون ممكنا.

    void print(node *p,int start)
    {
        start++;
        if (p->right != NULL)
        {
            print(p->right,start);
        }
        for (int i = 0; i <= start; i++)
        {
            cout<<"    ";
        } 
        cout << p->value<<endl;
        if (p->left != NULL)
        {
            print(p->left, start);
        }
    }

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

تحرير: إذا كنت فقط WAN فقط لطباعة النص، فإن Graphvis لديه لغة ترميز يمكن للمستخدم أن يمر إلى graphvis بدوره يجعل الصور الجميلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top