0Pricing
TypeScript Academy · درس

تحديد أنواع هياكل الأشجار

نمذجوا عقد الأشجار المتداخلة باستخدام الأنواع التكرارية

تحديد أنواع هياكل الأشجار درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

نوع عقدة الشجرة

تعمّم الأشجار مفهوم القوائم: إذ تحتوي كل عقدة على قيمة ومصفوفة من العقد الابنة من النوع نفسه. وهذا نوع تكراري يتضمن مصفوفة children.

type TreeNode<T> = {
  value: T;
  children: TreeNode<T>[];
};
const leaf: TreeNode<number> = { value: 1, children: [] };
console.log(leaf.value);

بناء شجرة صغيرة

العقدة التي لها أبناء ليست سوى كائنات متداخلة. وتمثل المصفوفة الفارغة الحالة الأساسية الطبيعية للورقة.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
const tree: TreeNode<string> = {
  value: "root",
  children: [
    { value: "a", children: [] },
    { value: "b", children: [] }
  ]
};
console.log(tree.children.length);

التداخل إلى عمق أكبر

يمكن أن يكون للعقد الأبناء أبناؤهم إلى أي عمق، لأن كل ابن هو نفسه TreeNode كامل.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
const tree: TreeNode<number> = {
  value: 1,
  children: [
    { value: 2, children: [{ value: 4, children: [] }] },
    { value: 3, children: [] }
  ]
};
console.log(tree.children[0].children[0].value);

جمع كل القيم

تزور دالة تكرارية كل عقدة، ثم تكرر العملية على أبنائها مع تجميع الناتج؛ وهذا اجتياز من العمق أولًا.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function sum(node: TreeNode<number>): number {
  let total = node.value;
  for (const child of node.children) total += sum(child);
  return total;
}
const t: TreeNode<number> = { value: 1, children: [{ value: 2, children: [] }, { value: 3, children: [] }] };
console.log(sum(t));

عدّ العقد

يستخدم عدّ العقد شكل الاجتياز نفسه: عقدة واحدة للعقدة الحالية، مضافًا إليها عدد جميع الأشجار الفرعية.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function count<T>(node: TreeNode<T>): number {
  return 1 + node.children.reduce((acc, c) => acc + count(c), 0);
}
const t: TreeNode<string> = { value: "r", children: [{ value: "a", children: [] }] };
console.log(count(t));

العثور على أقصى عمق

يكون العمق أكبر من أقصى عمق بين الأبناء بواحد، أو يساوي واحدًا للعقدة الطرفية التي لا أبناء لها.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function depth<T>(node: TreeNode<T>): number {
  if (node.children.length === 0) return 1;
  return 1 + Math.max(...node.children.map(depth));
}
const t: TreeNode<number> = { value: 1, children: [{ value: 2, children: [{ value: 3, children: [] }] }] };
console.log(depth(t));

جمع كل القيم

حوّل الشجرة إلى مصفوفة مسطّحة بضمّ القيمة الحالية إلى الأبناء بعد تسطيحهم.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function flatten<T>(node: TreeNode<T>): T[] {
  return [node.value, ...node.children.flatMap(flatten)];
}
const t: TreeNode<number> = { value: 1, children: [{ value: 2, children: [] }, { value: 3, children: [] }] };
console.log(flatten(t));

البحث في الشجرة

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

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function find<T>(node: TreeNode<T>, pred: (v: T) => boolean): TreeNode<T> | null {
  if (pred(node.value)) return node;
  for (const c of node.children) {
    const hit = find(c, pred);
    if (hit) return hit;
  }
  return null;
}
const t: TreeNode<number> = { value: 1, children: [{ value: 5, children: [] }] };
console.log(find(t, v => v === 5)?.value);

تحويل الشجرة

حوّل كل قيمة مع الحفاظ على البنية، وذلك بتحويل القيمة والأبناء تكراريًا.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function mapTree<T, U>(node: TreeNode<T>, fn: (v: T) => U): TreeNode<U> {
  return { value: fn(node.value), children: node.children.map(c => mapTree(c, fn)) };
}
const t: TreeNode<number> = { value: 1, children: [{ value: 2, children: [] }] };
console.log(mapTree(t, x => x * 100).value);

الأشجار تمثّل بيانات حقيقية

أنظمة الملفات، وأشجار DOM، والمخططات التنظيمية، وASTs كلها أشجار. ويصف نوع تكراري واحد جميع هذه البنى مع أمان كامل للأنواع.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
type FileTree = TreeNode<string>;
const fs: FileTree = { value: "/", children: [{ value: "home", children: [] }] };
console.log(fs.value, fs.children[0].value);

الأوراق والفروع

تكون العقدة ورقة عندما تكون children فارغة، وتكون فرعًا في غير ذلك. وغالبًا ما يوجّه هذا التمييز منطق الاجتياز.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function isLeaf<T>(node: TreeNode<T>): boolean {
  return node.children.length === 0;
}
console.log(isLeaf({ value: 1, children: [] }));

تحقق سريع: بنى الأشجار

اختبر مدى فهمك لكتابة أنواع بنى الأشجار.

مراجعة: كتابة أنواع بنى الأشجار

نمذجت الأشجار باستخدام TreeNode<T>، بحيث تحتوي كل عقدة على قيمة ومصفوفة من العقد الأبناء، ثم كتبت دوال تكرارية لجمعها وعدّها والبحث فيها وتحويلها.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
const t: TreeNode<number> = { value: 1, children: [{ value: 2, children: [] }] };
console.log(t.children[0].value);

الأسئلة الشائعة

هل درس «تحديد أنواع هياكل الأشجار» مجاني؟

نعم — نص درس «تحديد أنواع هياكل الأشجار» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحديد أنواع هياكل الأشجار»؟

نمذجوا عقد الأشجار المتداخلة باستخدام الأنواع التكرارية تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تحديد أنواع هياكل الأشجار»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريفات الأنواع التكرارية
  2. تحديد أنواع هياكل الأشجار
  3. أنواع قيم JSON
  4. عمق التكرار وحدوده
← العودة إلى TypeScript Academy