PDA

View Full Version : رفع اشکال:تابع Depth برای تعیین عمق و تعداد سطوح درخت باینری



Omid707
چهارشنبه 24 آذر 1389, 11:00 صبح
سلام
با عرض تسلیت ایام سوگواری حسینی

برنامه ای نوشتم برای تعیین عمق درخت باینری. الگوریتم تابع ، خوب یا بد کار خودمه و چون احساس کردم کمی نا مفهوم و گنگه توضیحاتش رو داخل کد ها نوشتم این تابع در اصل برای یک درخت حاوی اعداد صحیح نوشتم و کاملا درست کار کرد بعدا که خواستم واسه درخت حاوی کارکتر ها char و رشته ها استفاده کنم اخطار داد

این تابع از یک لیست پیوندی از نوع int کمک میگیره و لازمه که به اعضای خصوصی اون دسترسی داشته باشه بنابر این کلاس درخت رو در کلاس لیست پیوندی بعنوان دوست اعلام کردم و جواب هم گرفتم منتها وقتی درخت مقداری غیر از نوع صحیح داشته باشه اخطار عدم دسترسی به اعضای private اعلام میکنه البته راه ساده تری هم هست میتونم اعضای خصوصی رو public اعلام کنم ولی نمیخوام برای هر اخطاری کل کلاسهای قبلی رو تغییر بدهم . از روش وراثت هم کمک گرفتم بازم جواب نداد

تابع Depth

template <typename NODETYPE>
int Tree<NODETYPE>::Depth()const//تابع تعیین تعداد سطح های درخت باینری
{
/* در یک درخت باینری همواره زیر هر گره گرهی دیگر وجود دارد
و این ساختار ادامه دارد تا به یک گره برگ برسد که در زیر آن گره گرهی دیگر وجود ندارد
پس همیشه پایان تمام شاخه های درخت باینری به گره برگ ختم میشود
در یک سطح از درخت ممکن است چندین گره وجود داشته باشد و در سطحی دیگر فقط یک یا دو گره
پس از طریق شمردن گره ها نمیتوان به تعداد سطح ها پی برد.اما از هر گره برگ تا گره ریشه
تعداد مشخصی گره وجود دارند که نمایانگر سطحی هستند که برگ در آن حضور دارد آخرین سطح نیز باید
حداقل یک گره در خود داشته باشد پس میتوان برای هر گره برگ سطح آن را محاسبه کرد وگرهی
که در پایین ترین سطر قرار گرفته همان گره برگ موجود در سطر آخر است
و شماره سطح آن همان تعداد سطح های موجود در درخت باینری است */
int count=0;
int MAX;
List<int> DepthsList;//سطر و سطح هر گره برگ در یک لیست پیوندی قرار میگیرد
DepthAssistant(RootPtr,count,DepthsList);//تابع کمکی برای دسترسی راحت به داده های خصوصی
ListNode<int> *TempPtr=DepthsList.FirstPtr;
MAX=TempPtr->getData();
while( TempPtr != DepthsList.LastPtr )
{
TempPtr=TempPtr->NextPtr;
if( TempPtr->getData() > MAX ) { MAX=TempPtr->getData(); }
}
return MAX;
}

تابع کمکی DepthAssistant

template <typename NODETYPE>
void Tree<NODETYPE>::DepthAssistant
(TreeNode<NODETYPE> *VPtr,int &count, List<int> &DepthsList)const
{
if(VPtr != 0)
{
count++;
if( (VPtr->LeftPtr==0) && (VPtr->RightPtr==0) )
{
DepthsList.InsertAtFront(count);
}
DepthAssistant( VPtr->LeftPtr , count , DepthsList );
if( VPtr->LeftPtr != 0 ) {count--;}
DepthAssistant( VPtr->RightPtr , count , DepthsList );
if( VPtr->RightPtr != 0 ) {count--;}
}
}

کلاس درخت هم در کلاسهای لیست پیوندی وگره لیست به صورت زیر اعلان شده
+انگار برای کار کردن برنامه هردو شی درخت و لیست اجبارا باید از یک نوع باشند

#ifndef LIST_H
#define LIST_H

#include "ListNode.h"
template <typename NODETYPE> class Tree;

template <typename NODETYPE>
class List
{
friend class Tree<NODETYPE>;
public:
List();
~List();