630 likes | 983 Views
Binary Search Trees. ساختمان داده ها و الگوريتم ها. 26. 200. 28. 190. 213. 18. 12. 24. 27. درخت دودويي Binary Trees. تعريف بازگشتي درخت تهي، درختي دودويي است گرهي که فرزندان آن، دو درختچه باشند، درختي دودويي است
E N D
Binary Search Trees ساختمان داده ها و الگوريتم ها
26 200 28 190 213 18 12 24 27 درخت دودويي Binary Trees • تعريف بازگشتي • درخت تهي، درختي دودويي است • گرهي که فرزندان آن، دو درختچه باشند، درختي دودويي است • درختي دودويي است که با شروع از 1 و با اعمال 2، به تعداد متناهي بتوان آن را ساخت. 56 اين درخت دو دويي است ؟
پيمايش درخت دودويي • پيمايش درخت: انجام يک عمل ( مثل چاپ مقدار) بر روي گرههاي درخت • بازگشتي Recursive • تکراري Iterative • پيمايش بازگشتي: پردازش گره و درختچه هاي (فرزندان) چپ و راست آن • Inorder: 1-فرزند سمت چپ، 2-ريشه ، 3- فرزند سمت راست • Preorder: 1- ريشه، 2- فرزند سمت چپ، 3- فرزند سمت راست • Postorder:1-فرزند سمت چپ، 2- فرزند سمت راست، 3- ريشه
محاسبه عبارتهاي جبري • (a + b) * (c + d) + e – f/g*h + 3.25 • هر عبارت متشكل از سه نوع عضو زير است: • عملگر:.Operators (+, -, /, *). • عملوند ها • Operands (a, b, c, d, e, f, g, h, 3.25, (a + b), (c + d),etc.). • علايم ويژه دسته بندي : Delimiters ((, )).
درجه يك عملگر • تعداد عملوندهايي كه يك عملگر نياز دارد • عملگر مثل يك تابع و عملوند، آرگومان تابع است • عملگرهاي دوتايي، دو عملوند نياز دارند • a + b • c / d • e - f • عملگرهاي يكاني، يك عملوند نياز دارند • + g • - h • نمايش عبارتهاي جبري • نمايش ميانوندي • نمايش پيشوندي • نمايش پسوندي
نمايش ميانوندي • عملوند بين دو عملگر قرار مي گيرد • a * b • a + b * c • a * b / c • (a + b) * (c + d) + e – f/g*h + 3.25 • ترتيب و الويت عملگرها • براي تفسير درست عبارت لازم است • عمليات ضرب و تقسيم بر جمع و تفريق مقدم هستند • از چپ به راست است
علايم دسته بندي • با استفاده از اين علايم، عبارتهايي ساخته مي شوند كه در عبارات بزرگتر مثل يك عملوند بكار مي روند: • (a + b) * (c – d) / (e – f)
براي محاسبه عبارتهاي جبري به علايم دسته بندي، اوليت بندي عملگرها نياز است براي محاسبه آنها برنامه پيچيده اي نياز داريم نمايش پيشوندي و پسوندي چنين ملزوماتي ندارند محاسبه عبارات به شكل پسوندي يا پيشوندي براي كامپيوتر راحتتر است نمايش پسوندي Postfix نمايش پسوندي يك عملگر دوتايي با دو عملوند به صورت زير است: A o B = AB o , o is the operator نمايش پيشوندي يك عملگر دوديي چنين است: A o B = oAB , o is the operator محاسبه عبارت
چند نمونه عبارت پسوندي • Infix = a + b * c • Postfix = a b c * + • Infix = a * b + c • Postfix = a b * c + • Infix = (a + b) * (c – d) / (e + f) • Postfix = a b + c d - * e f + /
عملگرهاي يكاني • براي خوانايي عبارت از علايمي ديگر براي عملگرهاي يكاني استفاده مي كنيم • + a => a @ • + a + b => a @ b + • - a => a ? • - a-b => a ? b -
Postfix Evaluation • عبارت را از چپ به راست مي خوانيم و به هر عملوند كه مي رسيم آن را در پشته يادداشت مي كنيم • با رسيدن به عملگر به تعداد لازم عملوند از پشته بر مي داريم و عمل خواسته شده را انجام مي دهيم و سپس نتيجه محاسبه را در پشته يادداشت مي كنيم • نتيجه نهايي عبارت در بالاي پشته قرار دارد
stack Postfix Evaluation • (a + b) * (c – d) / (e + f) • a b + c d - * e f + / • a b + c d - * e f + / • b + c d - * e f + / • + c d - * e f + / b a
stack Postfix Evaluation • (a + b) * (c – d) / (e + f) • a b + c d - * e f + / • a b + c d - * e f + / d c • c d - * e f + / (a + b) • d - * e f + / • - * e f + /
stack Postfix Evaluation • (a + b) * (c – d) / (e + f) • a b + c d - * e f + / • * e f + / (c – d) (a + b)
Postfix Evaluation • (a + b) * (c – d) / (e + f) • ab + c d - * e f + / • a b+ c d - * e f + / • a b+ c d - * e f + / • a b+ c d - * ef + / f e • a b+ c d - * ef+ / (a + b)*(c – d) stack
Postfix Evaluation • (a + b) * (c – d) / (e + f) • a b + c d - * e f + / • a b + c d - * e f + / • a b + c d - * e f + / • a b + c d - * e f + / (e + f) • a b + c d - * e f + / • a b + c d - * e f + / (a + b)*(c – d) stack
+ a b - a نمايش يك عبارت با درخت دودويي • a + b • - a
/ / * + e f + - a b c d نمايش يك عبارت با درخت دودويي • (a + b) * (c – d) / (e + f)
+ a b - c d + e f * / مزاياي نمايش با درخت • عملوندهاي راست و چپ را براحتي مي توان نشان داد • با الگوريتم هاي بازگشتي براحتي مي توان عبارات را محاسبه كرد
پيمايش درخت : ملاقات گرههاي آن هر گره را فقط يكبار مي بينيم هنگام ديدن يك گره عمل خواسته شده را روي آن انجام مي دهيم Preorder Inorder Postorder Level order پيمايش درخت
public static void preOrder(BinaryTreeNode t) { if (t != null) { visit(t); preOrder(t.leftChild); preOrder(t.rightChild); } } پيمايش پيش ترتيب
a b c Preorder Example (visit = print) a b c
a b c f e d j g h i Preorder Example (visit = print) a b d g h e i c f j
/ * + e f + - a b c d Preorder Of Expression Tree / * + a b - c d + e f Gives prefix form of expression!
public static void inOrder(BinaryTreeNode t) { if (t != null) { inOrder(t.leftChild); visit(t); inOrder(t.rightChild); } } Inorder Traversal
a b c Inorder Example (visit = print) b a c
a b c f e d j g h i Inorder Example (visit = print) g d h b e i a f j c
a b c f e d j g h i g d h b e i a j c f پيمايش ميان ترتيب با تصوير هندسي درخت
/ * + e f + - a b c d a + b * c - d / e + f Inorder Of Expression Tree پيمايش ميان ترتيب، عبارت ميانوند را بدون پرانتز مي دهد
public static void postOrder(BinaryTreeNode t) { if (t != null) { postOrder(t.leftChild); postOrder(t.rightChild); visit(t); } } Postorder Traversal
a b c Postorder Example (visit = print) b c a
a b c f e d j g h i Postorder Example (visit = print) g h d i e b j f c a
/ * + e f + - a b c d Postorder Of Expression Tree a b + c d - * e f + / Gives postfix form of expression!
a b c f e d j g h i Traversal Applications • Make a clone. • Determine height. • Determine number of nodes.
Let t be the tree root. while (t != null) { visit t and put its children on a FIFO queue; remove a node from the FIFO queue and call it t; // remove returns null when queue is empty } Level Order
a b c f e d j g h i Level-Order Example (visit = print) a b c d e f g h i j
فرض كنيد اعضاي درخت غير تكراري هستند آيا با داشتن يكي از پيمايشها، مي توان درخت را ساخت!؟ اگر پيمايش داده شده بيش از يك عضو داشته باشد؛ نمي توان درخت را به صورت منحصر بفرد ساخت آيا با داشتن دو نوع پيمايش مي توان را درخت را به صورت منحصر بفرد ساخت ؟ شايد بتوانيم! ساخت درخت دودويي
preorder = ab a b a a a a b b b b a b a a b b Some Examples inorder = ab postorder = ab level order = ab
preorder = ab a a b b Preorder And Postorder postorder = ba • Preorder and postorder do not uniquely define a binary tree. • Nor do preorder and level order (same example). • Nor do postorder and level order (same example).
inorder = g d h b e i a f j c preorder = a b d g h e i c f j Scan the preorder left to right using the inorder to separate left and right subtrees. a is the root of the tree; gdhbei are in the left subtree; fjc are in the right subtree. a gdhbei fjc Inorder And Preorder
preorder = a b d g h e i c f j b is the next root; gdh are in the left subtree; ei are in the right subtree. a a b fjc gdhbei fjc gdh ei Inorder And Preorder
preorder = ab d g h e i c f j d is the next root; g is in the left subtree; h is in the right subtree. a a b fjc b fjc d ei gdh ei g h Inorder And Preorder
Scan postorder from right to left using inorder to separate left and right subtrees. inorder = g d h b e i a f j c postorder = g h d i e b j f c a Tree root is a; gdhbei are in left subtree; fjc are in right subtree. Inorder And Postorder
Scan level order from left to right using inorder to separate left and right subtrees. inorder = g d h b e i a f j c level order = a b c d e f g h i j Tree root is a; gdhbei are in left subtree; fjc are in right subtree. Inorder And Level Order
درخت جستجويي دو دويي = Binary Search Tree (BST) ساختمان داده اي ديگر براي نگهداري مجموعه هاي پوياست که عمليات زير را انجام مي دهد: Search, Minimum, Maximum, Predecessor, Successor, Insert, and Delete. براي ساختن Dictionary. و Priority Queue مي توان از آن استفاده کرد زمان انجام عمليات اوليه، متناسب با عمق(ارتفاع) درخت است.O(h). درخت جستجويي دو دويي
با استفاده از ساختار پيوندي گرهها نمايش داده مي شود root(T): Tاشاره گر به ريشه درخت هر گره مشخصه هاي زير را دارد: key left – pointer to left child: root of left subtree. right – pointer to right child : root of right subtree. p – pointer to parent. p[root[T]] = NIL (optional). نمايشBST
مشخصه کليد (key) بايد اين خواص را داشته باشد y in left subtree of x, then key[y] key[x]. y in right subtree of x, then key[y] key[x]. 26 200 28 190 213 18 12 24 27 خواص BST 56
26 200 28 190 213 18 12 24 27 پيمايشInorder با استفاد از خاصيت BST مي توان مقادير درخت را به صورت صعودي يکنوا نشان داد Inorder-Tree-Walk (x) 1. ifx NIL 2. then Inorder-Tree-Walk(left[p]) 3. print key[x] 4. Inorder-Tree-Walk(right[p]) 56 12 18 24 26 27 28 56 190 210 213 • هزينه پيمايش چقدر است ؟
درستي پيمايش Inorder • اثبات: درستي و پايان پذيري • با استفاده از استقراء رياضي: پيمايش درخت سمت چپ و راست به درست انجام مي شود • اگر درخت تهي باشد، درستي و پايان پذيري بديهي است • اگر درخت بيش از يک گره باشد • درختچه سمت چپ - با استفاده از استقراء - چاپ مي شود • ريشه چاپ مي شود؛ با تکيه بر خاصيت BST مقدار ريشه از مقادير درختچه سمت چپ بزرگتر است بنابراين در جايگاه خود چاپ مي شود • درخت سمت راست نيز بنابر استقراء بدرستي چاپ مي شود و مقادير آن از مقدار ريشه بزرگترند
جستجو در BST • کليه عمليات مجموعه هاي پويا را مي توان با هزينه اي متناسب با عمق درخت انجام دادO(h). • اگر درخت متوازن باشد( عمق درختچه هاي سمت چپو راست نزديک هم باشد) h = (lg n) • در بدترين حالت: h =(n). • درخت دودويي به صورت زنجيره اي از گرهها در مي آيد