درخت ها

lighting

Member
برای این که بخواهیم یه الگوریتم بنویسیم که جای تمام فرزندان چپ و راست رو عوض کنه من برای بازگشتی این طوری نوشتم ولی سوال غیر بازگشتی می خواد غیر بازگشتی اون رو چطور باید بنویسیم؟

کد:
int swap children (node *T)
{
if (T==NULL) return;
swap the left and right children of T
l=left children of T
swap children (l)
r=right children of T
swap children (r)
}
 

lighting

Member
یعنی این که برای غیر بازگشتی یه حلقه for بنویسیم تا زمانی که فرزندان سمت چپ وجود داره جاشون با فرزندان راست عوض بشه برای عوض شدن هم الگوریتمی مثل الگوریتم بالا بنویسیم؟
نمی دونم البته شایدم این راه درست نباشه!!!
 

the_king

مدیرکل انجمن
برای این که بخواهیم یه الگوریتم بنویسیم که جای تمام فرزندان چپ و راست رو عوض کنه من برای بازگشتی این طوری نوشتم ولی سوال غیر بازگشتی می خواد غیر بازگشتی اون رو چطور باید بنویسیم؟

کد:
int swap children (node *T)
{
if (T==NULL) return;
swap the left and right children of T
l=left children of T
swap children (l)
r=right children of T
swap children (r)
}

یعنی این که برای غیر بازگشتی یه حلقه for بنویسیم تا زمانی که فرزندان سمت چپ وجود داره جاشون با فرزندان راست عوض بشه برای عوض شدن هم الگوریتمی مثل الگوریتم بالا بنویسیم؟
نمی دونم البته شایدم این راه درست نباشه!!!

هر جا که الگوریتم بازگشتی بود و در تابع بیش از یکبار فراخوانی مجدد تابع صورت می گرفت باید از پشته استفاده کنید :
کد:
int swap children (node *T)
{
	p = new Stack;
	p.Push(T);
	while (! p.Empty)
	{
		N = p.Pop();
		if (N != NULL)
		{
			swap the left and right children of N;
			l=left children of N;
			p.Push(l);
			r=right children of N;
			p.Push(r);
		}
	}
}
 

lighting

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

جدیدترین ارسال ها

بالا