PDA

View Full Version : سوال: جستجو در ساختار درخت



فاطمه_14
جمعه 19 خرداد 1391, 13:52 عصر
سلام
عزیزان
خسته نباشید
ببخشید اگه من بخوام گرهی رو در کنترل treeview1 جستجو کنم باید چی کار کنم؟

m.akar
جمعه 19 خرداد 1391, 15:51 عصر
بهترین کار نوشتن تابع بازگشتی است تا در تمامی نودهای فرزند جستجو را انجام دهد.

به عنوان مثال تابع جستجوی زیر بر روی Text هر نود می گردد و اگر برابر بود آن نود را درون یک لیست از نود ها اضافه می کند در پایان کار نود های موجود در لیست نود ها پاسخ های جستجو هستند.

private System.Collections.Generic.List<TreeNode> FindedNodes = new List<TreeNode>();
private void SearchNodes(TreeNode RootNode, string searchtxt)
{
if (RootNode.Text == searchtxt)
FindedNodes.Add(RootNode);
foreach (TreeNode ChildNode in RootNode.ChildNodes)
SearchNodes(ChildNode, searchtxt);

}

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

protected void Button1_Click(object sender, EventArgs e)
{
//start search
FindedNodes.Clear();
foreach (TreeNode RootNode in TreeView1.Nodes)
SearchNodes(RootNode, "test");
//end of search

//List of Finded Nodes
foreach (TreeNode findedNode in FindedNodes)
{
// کاری که می خواهید با نود های پیدا شده انجام دهید
}

}

kamran_14
جمعه 19 خرداد 1391, 16:44 عصر
m.akar
1- فرق این 2 برنامه ای که شما نوشتید از هم دیگه چیه؟

m.akar
جمعه 19 خرداد 1391, 17:14 عصر
تابع بازگشتی ( تابع اولی) کار جستجو در نود ارسال شده به آن را انجام می دهد و بعد از آن برای تک تک نود های فرزند نود ارسال شده تابع جستجو را فراخوانی می کند.

تابع دوم وقتی رویدادی اجرا می شود شروع می شود. مثلا وقتی کاربری روی دکمه جستجو کلیک می کند. این تابع نود های Root مربوط به Treeview1 را به عنوان شروع کننده جستجو به تابع جستجو ارسال می کند. بعد از این که جستجو درتمامی نود ها انجام شد نود های یافته شده در درخت درون لیست FindedNodes قرار دارند و می توان از آن ها استفاده کرد.

فاطمه_14
جمعه 19 خرداد 1391, 22:53 عصر
سلام
دستتون درد نکنه از اینکه جواب مفیدی دادید
حالا من می خوام یک نود ایجاد کنم و گره پدر رو خودم انتخاب کنم و اون گره رو وصل کنم به پدرش می شه کمکم کنید؟
یعنی من می خوام با اندیس یا آدرس گره،به گره پدر دسترسی داشته باشم تا اینکه بتونم گره پدر رو تعیین کنم
ممنون می شم اگه کمکم کنید

m.akar
شنبه 20 خرداد 1391, 09:01 صبح
وقتی یک گره را با ایتفاده از تابع بالا پیدا کردید برای اضافه کردن برای اضافه کردن یک گره به ذیل آن می توانید از دستور زیر استفاده کنید:

نکته: من فرض کردم که فقط یک گره از تابع بالا بازگشته ( زیرا تابع بالا تمامی نود های جواب را برمی گرداند و ممکن ازست بیش از یک نود باشد)

foreach (TreeNode findedNode in FindedNodes)
{
findedNode.ChildNodes.Add(yourTreeNode);
}

فاطمه_14
یک شنبه 21 خرداد 1391, 12:06 عصر
سلام
خسته نباشید
ممنون از جواب های خوبتون من می خوام کلکیسیون search برای گره ها پیدا کنم
این کد مربوط به جستجوی یه گره، بر حسب نام گره است
وقتی گره مورد نظر یافت شد آن گره را با رنگ قرمز های لایت می کند.
چرا در اینجا مقدار تابع treeView1.Nodes.Find(name,b) در یه آرایه باید ریخته بشه فرض من بر این است که کلید مورد جستجوی من که همون گرهم است فقط یه بار در درخت آورده شده یعنی هیچ نام تکراری در گره وجود ندارد پس یا یه گره انتخاب می شه یا اصلا گرهی انتخاب نمی شه پس من نیاز به آرایه ندام چون طولش یا صفره یا یک ولی نیاز به یه متغییر دارم اما وقتی کروشه های کنار آرایه ی arr را تغییر می دم تا به متغیر تبدیل بشه برنامه خطا می ده . می شه کمکم کنید
چرا در این کد

try
{
TreeNode[] arr = treeView1.Nodes.Find(name,b);

for (i = 0; i < arr.Length; i++)
{
treeView1.SelectedNode = arr[i];
treeView1.SelectedNode.BackColor = Color.Red;
}
}
catch { }

tooraj_azizi_1035
یک شنبه 21 خرداد 1391, 14:01 عصر
سلام
اول اینکه شما باید برای جلو گیری از ورود Node های تکراری باید از متد Find استفاده کنی تا در صورت وجود دوباره اون رو به درخت اضافه نکنی.
و دوم اینکه چون مطمئن هستیم که خروجی Find حداکثر یک Node است نیازی به استفاده از آرایه نیست بلکه باید اینگونه عمل کنیم:
TreeNode theNode=treeView1.Nodes.Find(name,b).First();
if(theNode!=null)
{
theNode.Selected=true;
.theNode.BackColor = Color.Red;
}

فاطمه_14
یک شنبه 21 خرداد 1391, 21:36 عصر
سلام
اول اینکه شما باید برای جلو گیری از ورود Node های تکراری باید از متد Find استفاده کنی تا در صورت وجود دوباره اون رو به درخت اضافه نکنی.
و دوم اینکه چون مطمئن هستیم که خروجی Find حداکثر یک Node است نیازی به استفاده از آرایه نیست بلکه باید اینگونه عمل کنیم:سلام
خسته نباشید
1- اما من این کد رو در C#‎‎‎ نوشتم error داد
2- اگه اندیس و سطح درخت متغیر باشه یعنی توسط کاربر با یه text مشخص بشه باید برای ایجاد فرزند برا اون گره چی کار کرد؟
3- می شه با بیان یه مسیر (ی از گره ها) در C#‎ یه گره به درخت treeView اضافه کرد؟
ممنون میشم اگه کمک کنید حتی با جواب دادن برای یه سوال.

cherchil_hra
دوشنبه 22 خرداد 1391, 07:48 صبح
سلام
چرا در اینجا مقدار تابع treeView1.Nodes.Find(name,b) در یه آرایه باید ریخته بشه فرض من بر این است که کلید مورد جستجوی من که همون گرهم است فقط یه بار در درخت آورده شده یعنی هیچ نام تکراری در گره وجود ندارد پس یا یه گره انتخاب می شه یا اصلا گرهی انتخاب نمی شه پس من نیاز به آرایه ندام چون طولش یا صفره یا یک ولی نیاز به یه متغییر دارم اما وقتی کروشه های کنار آرایه ی arr را تغییر می دم تا به متغیر تبدیل بشه برنامه خطا می ده . می شه کمکم کنید
چرا در این کد

try
{
TreeNode[] arr = treeView1.Nodes.Find(name,b);

for (i = 0; i < arr.Length; i++)
{
treeView1.SelectedNode = arr[i];
treeView1.SelectedNode.BackColor = Color.Red;
}
}
catch { }

این پیش فرض شما هستش که نام (Name) تکراری برای node های شما وجود نداره اما برای برنامه اینطور نیست. یعنی شما می تونی در یک درخت node های مختلفی با یک name ایجاد کنی. بنابراین خروجی جستجوی شما از نوع آرایه هست.
حالا چون شما مطمئن هستی موقع جستجو یک مقدار یا هیچی برمیگردونه پس:
TreeNode[] arr = treeView1.Nodes.Find( مقدار جستجو,true);
if (arr.Length > 0)
{
string s = arr[0].Text;
}