Hướng dẫn what is a tree in javascript? - cây trong javascript là gì?

Cây là một trong những cấu trúc dữ liệu phổ biến nhất trong khoa học máy tính và cách tự nhiên để mô hình hóa các lĩnh vực chủ đề nhất định. Cây (như một cấu trúc dữ liệu) được tìm thấy bằng cách này hay cách khác bởi tất cả mọi người, ngay cả những người không chỉ lập trình mà còn từ các máy tính nói chung. Ví dụ rõ ràng nhất là cây gia đình, và cái chuyên dụng hơn là cây tập tin. Và, tất nhiên, HTML (cũng như JSON, XML và hơn thế nữa), nó cũng có cấu trúc cây. Bất kỳ hệ thống phân cấp là một cây theo định nghĩa.family tree , and the more specialized one is the file tree . And, of course, HTML (as well as json , xml and more), it also has a tree structure. Any hierarchy is a tree by definition.

Có một khía cạnh rất thú vị đối với cây. Tôi thường quan sát mức độ hiểu biết về chủ đề của cây và khả năng làm việc với chúng có mối tương quan mạnh mẽ với mức độ của nhà phát triển.

JS: Cây → Định nghĩa

Tính năng chính của cấu trúc cây là nó là đệ quy. Nói cách khác, một cây bao gồm các cây con, từ đó bao gồm các cây con, đến lượt cuối cùng, ở phía dưới, có những chiếc lá - và bây giờ chúng không có con cháu và không dẫn đến bất cứ nơi nào.recursive . In other words, a tree consists of subtrees, which in turn consist of subtrees, which in turn … In the end, at the very bottom, there are leaves — and now they have no descendants and do not lead anywhere.

Một cây bao gồm các nút và cạnh giữa chúng. Các xương sườn trong thực tế không tồn tại, chúng chỉ cần để hình dung kết nối và, nếu cần thiết, để mô tả nó. Các nút được chia thành hai loại: bên trong (những người có hậu duệ) và các nút lá (những người không có hậu duệ). Trong trường hợp của một hệ thống tệp, các nút lá được thể hiện bằng các tệp và các nút nội bộ là các thư mục.nodes and edges between them. The ribs in reality do not exist, they are needed only to visualize the connection and, if necessary, to describe it. Nodes are divided into two types: internal (those that have descendants) and leaf nodes (those that have no descendants). In the case of a file system, leaf nodes are represented by files, and internal ones are directories.

Trong cây, mỗi đỉnh có cha mẹ (hoặc tổ tiên). Ngoại lệ duy nhất là nút gốc - nó không có cha mẹ và cây bắt đầu với nó. Số lượng con cháu ở bất kỳ đỉnh bên trong nào, nói chung, có thể là bất kỳ. Ngoài ra, các cây làm nổi bật khái niệm độ sâu (độ sâu), xác định có bao nhiêu bước bạn cần đi dọc theo các đỉnh từ gốc để đạt được dòng điện (cái bạn đang nhìn). Các đỉnh ở cùng độ sâu với cha mẹ thông thường được gọi là anh em hoặc chị em.parent (or ancestor). The only exception is the root node — it has no parents, and the tree begins with it. The number of descendants at any internal vertex, in general, can be any. In addition, trees highlight the concept of depth (depth), which determines how many steps you need to go along the peaks from the root in order to reach the current (the one you are looking at). The peaks at the same depth with the common parent are called brotherly or sisterly.

Sự định nghĩa

Số lượng cách để mô tả cây là vô hạn. Ở đây chúng tôi chỉ xem xét những người dựa trên sự lặp lại của cấu trúc cây trong cấu trúc dữ liệu mô tả nó. Tùy chọn nguyên thủy nhất là các mảng lồng nhau:

Trong các ví dụ trên, gốc là chính mảng và tất cả các yếu tố của nó là trẻ em. Nếu đứa trẻ không phải là một mảng, thì nó được coi là một nút lá, nếu không - như một nút bên trong. Các nút nội bộ, lần lượt, bao gồm trẻ em. Một cấu trúc như vậy có một giới hạn. Các nút nội bộ không thể lưu trữ dữ liệu, nhưng, nói chung, một sơ đồ như vậy có thể được sử dụng và gặp phải trong cuộc sống.

Bạn có thể đi xa hơn và đạt được sự linh hoạt hơn. Hãy tưởng tượng mỗi phần tử của cây như một mảng trong đó phần tử đầu tiên là giá trị được lưu trữ trong nút và phần tử thứ hai là mảng của trẻ em. Nếu phần tử thứ hai bị thiếu, thì chúng tôi cho rằng nút hiện tại là lá. . Imagine each element of the tree as an array in which the first element is the value stored in the node, and the second element is the array of children. If the second element is missing, then we assume that the current node is leaf.

Tùy chọn này là nhiều dòng hơn, nhưng cho phép bạn lưu trữ dữ liệu (tùy ý) trong bất kỳ nút nào, thậm chí không phải là một tờ. Bây giờ, tôi hy vọng bạn hiểu nguyên tắc của tổ chức và bạn có thể thực hành bản thân phát minh ra các cách để đóng gói cây thành một mảng. Nhân tiện, một chi tiết thú vị. Mã nguồn cho các ngôn ngữ cấp cao cũng có cấu trúc đệ quy. Nhìn vào mã:

Đối số chức năng là các biểu thức, có nghĩa là chúng có thể là các cuộc gọi chức năng, gây ra đệ quy. Nếu mã trên được viết lại theo kiểu ngôn ngữ Lisp, thì chúng ta sẽ nhận được cây thật nhất bao gồm các danh sách:

Thỏa thuận ở đây là: Yếu tố đầu tiên của danh sách là một hàm (bất kỳ hoạt động nào được coi là chức năng) và mọi thứ khác là đối số của nó.

Một định nghĩa khác dựa trên các mảng kết hợp và cụ thể trong JavaScript - trên các đối tượng:

Nhìn chung, rằng mảng, rằng chính đối tượng luôn có thể được coi là một cây, bất kể cấu trúc bên trong của nó và sự hiện diện của các yếu tố lồng nhau. Đó là bản chất của họ. Cấu trúc có mặt ở nơi bạn cần lưu trữ chính xác dữ liệu cây, ví dụ, hệ thống tệp. Để bắt đầu, tôi sẽ tiết lộ bí mật; Hầu hết các hệ thống tệp không chỉ có cấu trúc cây, mà còn được thể hiện ở cấp độ triển khai dưới dạng cấu trúc dữ liệu.

Chúng tôi sẽ làm việc với cùng một cấu trúc, tạo ra các chức năng hỗ trợ khác nhau để tìm kiếm và sửa đổi nội dung. Dưới đây là mã tạo ra đối tượng cây bắt buộc:

Do kết quả thực thi mã, kết quả sau đây đã thu được:

Chế độ xem thư mục:

Xem tập tin:

Một số tuyên bố liên quan đến cây trên là:

  • Tệp - Các nút lá
  • Các thư mục là nội bộ. Có thể chứa cả tệp và thư mục bên trong tài sản ____
  • meta - một đối tượng có dữ liệu tùy ý, ví dụ, kích thước, ngày tạo, v.v.
  • Thư mục từ tệp được phân biệt, trước hết, theo loại được chỉ định bởi thuộc tính tương ứngtype specified by the corresponding property

Về phần cuối cùng tôi sẽ nói một vài từ. Chính sự hiểu biết về OOP, được nói đến rất nhiều, là mã được xem xét từ quan điểm của các loại, và bạn có thể thấy chúng. Điều quan trọng là phải phân bổ chúng một cách rõ ràng và không phân tích chúng bằng các dấu hiệu gián tiếp - ví dụ, xác định loại nút nào trước mặt chúng ta (loại nào!) của tài sản children.

JS: Cây → Traversal

Một liệt kê từng bước các yếu tố cây dọc theo các liên kết giữa các nút tổ tiên và các nút hậu duệ được gọi là đi bộ trên cây. Điều này được hiểu rằng trong quá trình thu thập dữ liệu, mỗi nút sẽ chỉ bị ảnh hưởng một lần. Nhìn chung, mọi thứ đều giống như bỏ qua bất kỳ bộ sưu tập nào bằng cách sử dụng vòng lặp hoặc đệ quy. Chỉ trong trường hợp của cây, mới có nhiều cách để đi xung quanh hơn là từ trái sang phải và phải sang trái. Một thứ tự truyền tải được sử dụng - đường vòng theo chiều sâu, vì nó có được tự nhiên bằng cách đi lại đệ quy. Về những cách khác, bạn có thể đọc trên Wikipedia hoặc trong các cuốn sách được đề xuất Heksleta.tree walk . It is understood that during the crawl process, each node will be affected only once. By and large, everything is the same as bypassing any collection using a loop or recursion. Only in the case of trees are there more ways to go around than just left to right and right to left. One traversal order is used — detour in depth , since it is naturally obtained by recursive traversal. On the other ways you can read on Wikipedia or in the recommended books Heksleta.

Tìm kiếm chiều sâu đầu tiên

Một trong những phương thức truyền tải cây (đồ thị nói chung). Chiến lược cho tìm kiếm này là đi xa nhất có thể thành một cây con. Thuật toán này tự nhiên rơi vào giải pháp đệ quy và tự xuất hiện.

Hãy xem xét thuật toán này trên ví dụ về cây sau:

Tôi đánh dấu mỗi đỉnh không lá bằng dấu hoa thị. Thu thập thông tin bắt đầu ở nút gốc.

  1. Kiểm tra xem Vertex A có con không. Nếu vậy, chúng tôi chạy đường ngang đệ quy cho mỗi đứa trẻ một cách độc lập.
  2. Bên trong cuộc gọi đệ quy đầu tiên là Subtree sau:

Lặp lại logic của bước đầu tiên. Chúng tôi rơi xuống mức dưới đây.

  1. Bên trong có một yếu tố lá E. Chức năng đảm bảo rằng nút không có con, công việc cần thiết và trả lại kết quả cho đầu.
  2. Một lần nữa chúng ta thấy mình trong một tình huống:

Ở nơi này, như chúng ta nhớ, cuộc gọi đệ quy đã được đưa ra trên mỗi đứa trẻ. Vì đứa trẻ đầu tiên đã được viếng thăm, cuộc gọi đệ quy thứ hai vào nút Fand thực hiện công việc của nó ở đó. Sau đó, lợi nhuận cao hơn xảy ra và mọi thứ lặp lại cho đến khi nó đạt đến gốc.

JS: Cây → Bản đồ

Một ví dụ về bài học trước là cực kỳ đơn giản để khái quát hóa chức năng bậc cao map. Hãy để tôi nhắc bạn rằng bản đồ là một bản đồ. Nếu trước đó chúng tôi hiển thị danh sách phẳng, bây giờ chúng tôi sẽ hiển thị cấu trúc lồng nhau. Từ quan điểm của ngữ nghĩa, không có gì thay đổi. Bản đồ bản đồ đến từng nút một nút mới, do đó, cấu trúc của toàn bộ cây vẫn giữ nguyên, nhưng dữ liệu bên trong nút thay đổi.map . If earlier we displayed flat lists, now we will display the nested structure. From the point of view of semantics, nothing changes. map maps to each node a new node, so the structure of the entire tree remains the same, but the data inside the node changes.

JS: Cây → Bộ lọc

Ngược lại map, filter cho cây, dưới dạng nó được sử dụng cho các bộ sưu tập, thực tế không phù hợp. Phán xét cho chính mình. Giả sử chúng tôi muốn tìm kiếm hệ thống tệp cho các tệp khớp với mẫu *.log. Nhiệm vụ ngay lập tức được chia thành hai nhiệm vụ. Lọc rời các nút lá và lọc tiếp theo theo mẫu. Rõ ràng, sau bộ lọc đầu tiên, chúng tôi đã muốn làm việc với danh sách, nhưng không phải với cây. Hơn nữa, cây sẽ trông như thế nào trong đó chỉ có một tệp và ý nghĩa thực tế của nó là gì? Dù muốn hay không, hầu hết các bộ lọc cấu trúc cây sẽ tạo ra danh sách phẳng ở đầu ra.

Tuy nhiên, đôi khi, nó được sử dụng, để hoàn thành bức tranh, nó đáng để trải qua tất cả các bước. Đầu tiên bạn cần quyết định những gì bạn cần quay lại trong một tình huống nếu nút không thỏa mãn vị ngữ. Nó là hợp lý khi sử dụng meta1.

Tuy nhiên, đôi khi, nó được sử dụng, để hoàn thành bức tranh, nó đáng để trải qua tất cả các bước. Đầu tiên bạn cần quyết định những gì bạn cần quay lại trong một tình huống nếu nút không thỏa mãn vị ngữ. Nó là hợp lý khi sử dụng meta1.

Nhìn vào việc triển khai bộ lọc, rõ ràng là nếu nút không thỏa mãn vị ngữ, thì con cái của nó hoàn toàn không được xem xét. Trong nút ví dụ trên b. Theo đó, con của cô ấy và giá vé thậm chí không được phân tích và lọc bằng giường và.

Nó trông thú vị và mục này meta4. Thực tế là bộ lọc của chúng tôi không hoạt động với danh sách, nhưng hoạt động với một nút gốc cụ thể. Theo đó, nếu chúng ta xử lý trẻ em, thì kết quả của việc lọc số lượng trẻ em không giảm. Ở vị trí của họ xuất hiện meta1. Do đó, trẻ em được bò bằng mảng mapAN children được theo dõi bởi filter. Sau đó, tất cả các meta1 sẽ được lọc.

JS: Cây → giảm

type0PEROMIME Chức năng thú vị và hữu ích nhất để làm việc với cây. Tập hợp dữ liệu là một hoạt động rất phổ biến. Đếm số lượng tệp trong một thư mục, tổng trọng lượng của tất cả các tệp trong một thư mục, lấy danh sách tất cả các tệp trong một thư mục, tìm tất cả các tệp theo mẫu, sẽ thuận tiện hơn khi thực hiện tất cả những điều này với type0.

Tính năng chính type0in sự hiện diện của pin, được kéo qua tất cả các thách thức đến chính độ sâu, và sau đó tăng lên đỉnh và cuối cùng, trở lại bên ngoài.

Trên đây là một thử nghiệm ví dụ được sử dụng type0 để đếm số lượng nút trong cây. Với trợ giúp type0, nhiệm vụ được thực hiện trong một dòng.

Cũng như trong các chức năng khác có thứ tự cao hơn, nút được chuyển đến hàm xử lý nói chung, và không chỉ là tên. Điều thú vị nhất xảy ra khi xử lý trẻ em. Một cuộc gọi type0 trên mỗi đứa trẻ sẽ xảy ra với pin kéo qua quá trình xử lý của mỗi đứa trẻ. Bởi vì điều này, hóa ra có một sự xuất hiện bên ngoài children, trong khi mỗi đứa trẻ lấy đầu vào type8External hiện tại type0 và bắt đầu cái bên trong với pin này.

JS: Cây → Tìm kiếm

Tìm kiếm hệ thống tệp là một hoạt động được thực hiện cực kỳ thường xuyên. Nó mở ra rất nhiều nhiệm vụ thú vị. Hãy để chúng tôi kiểm tra một trong số họ với một số biến thể. Giả sử chúng tôi muốn liệt kê tất cả các thư mục trống. Sử dụng type0, để thực hiện nhiệm vụ này là tầm thường. Lấy cấu trúc tệp sau:

Cấu trúc này có hai thư mục trống: children1and children2. Thuật toán tìm kiếm là nguyên thủy:

  1. Chúng tôi khởi tạo một type0Array
  2. Nếu loại nút children4 và nó không có con - thêm vào mảng

Ví dụ này cho thấy vẻ đẹp của các chức năng bậc cao. Chúng tôi hoàn toàn bị che giấu khỏi cơ chế để bỏ qua cây, hơn nữa, bạn thậm chí không thể biết rằng chúng tôi làm việc với cây.

Hãy để cố gắng làm phức tạp nhiệm vụ. Tìm tất cả các thư mục trống, nhưng với độ sâu tối đa của cấp độ tìm kiếm 2. nghĩa là một thư mục trống children1Matches điều kiện này, nhưng children2Not. Đúng, bạn có thể gọi ngay các giải pháp sau:

  1. Vì việc triển khai của chúng tôi không cung cấp thông tin về mức độ sâu của nút hiện tại, chúng tôi có thể thực hiện đi bộ thủ công bằng cách vượt qua hai pin: một với một mảng cuối cùng, thứ hai với mức độ làm tổ.
  2. Bạn có thể mở rộng mô tả của chính cây bằng cách thêm thông tin về mức độ làm tổ ở đó. Một mặt, một phương thức như vậy sẽ không yêu cầu thay đổi mã ứng dụng, vì nó đủ để thay đổi việc thực hiện các hàm giao diện children8and children9. Mặt khác, trong một sơ đồ như vậy, độ sâu của tất cả các nút sẽ được tính toán liên quan đến gốc, điều này là bất tiện.
  3. Bạn có thể viết type0Who có thể cho biết đi sâu đến mức nào. Và sau đó giải quyết vấn đề với việc sử dụng nó.

Hãy để cố gắng giải quyết vấn đề này bằng phương pháp đầu tiên.

Một vài điểm quan trọng:

  1. Bây giờ bạn cần theo dõi độ sâu hiện tại, vì vậy nó được truyền đến E1, tăng theo từng lần lặp.
  2. Nếu bạn đi sâu hơn mức cần thiết, sau đó trả lại kết quả.

Phần còn lại của mã giống như trong type0 thông thường.

JS: Cây → Tập hợp

Hãy để thực hành với một biến thể khác của tập hợp dữ liệu trên các hệ thống tệp. Chúng tôi viết một chức năng lấy một thư mục làm đầu vào và trả về một danh sách các thư mục của cấp độ tổ đầu tiên và số lượng tệp trong đó, bao gồm tất cả các thư mục con. Hàm này sau đó có thể được sử dụng trong một tiện ích dòng lệnh thực hiện tác vụ tương ứng.

Như có thể thấy từ câu lệnh, nhiệm vụ không thể được giải quyết bằng cách sử dụng nó trong hình thức thuần túy của nó, vì chúng ta không cần phải thu thập tất cả các nút, mặt khác, chúng ta cần thu thập dữ liệu để đếm số lượng tệp. Do đó, nhiệm vụ của chúng tôi rơi vào hai phần phụ: trích xuất các thư mục con của gốc hiện tại và gọi việc đếm các tệp bên trong mỗi đứa trẻ.

Hãy bắt đầu bằng cách đếm số lượng tệp. Nhiệm vụ này chứa một type0 nguyên thủy:

type0 hoàn toàn điển hình làm tăng pin lên một nếu loại nút E6. Bước tiếp theo là trích xuất tất cả trẻ em từ nút nguồn và áp dụng số lượng cho từng người trong số chúng.

Đó là, chúng tôi đã chuyển sang trẻ em trực tiếp bằng cách đầu tiên lọc chúng, và sau đó thực hiện ánh xạ tới mảng cần thiết chứa cho mỗi thư mục của các tệp trong đó.

Tài nguyên bổ sung

  • Giới thiệu về cấu trúc dữ liệu cây của mycodeschoolmycodeschool
  • Cây bằng WikipediaWikipedia
  • Làm thế nào để không bị cây cối của Vaidehi Joshi tài năng bối rối
  • Giới thiệu về Cây, Bài giảng của Giáo sư Jonathan CohenJonathan Cohen
  • Giới thiệu về Cây, Bài giảng của Giáo sư David Schmidt David Schmidt
  • Giới thiệu về Cây, Bài giảng của Giáo sư Victor AdamchikVictor Adamchik
  • Cây với Gayle Laakmann McDowellGayle Laakmann McDowell
  • Thực hiện và xét nghiệm cây nhị phân
  • Khóa học Coursera: Cấu trúc dữ liệu của Đại học California, San DiegoUniversity of California, San Diego
  • Khóa học Coursera: Cấu trúc dữ liệu và hiệu suất đa dạng của California, San DiegoUniversity of California, San Diego
  • Khái niệm cây tìm kiếm nhị phân và thực hiện theo chương trình PaulPaul Programming
  • Thực hiện và kiểm tra cây tìm kiếm nhị phân
  • Cây truyền tải bằng WikipediaWikipedia
  • Cây tìm kiếm nhị phân Xóa thuật toán nút bằng GeekSforGeeksGeeksforGeeks
  • Cây tìm kiếm nhị phân Xóa thuật toán nút của AlgoListAlgolist
  • Học Python từ Zero đến Hero

Một cây có ví dụ là gì?

Một cây là một cấu trúc dữ liệu phân cấp được định nghĩa là một tập hợp các nút.Các nút đại diện cho giá trị và các nút được kết nối bởi các cạnh.Một cây có các thuộc tính sau: cây có một nút gọi là gốc.a hierarchical data structure defined as a collection of nodes. Nodes represent value and nodes are connected by edges. A tree has the following properties: The tree has one node called root.

Giải thích một cái cây là gì?

Định nghĩa của cây Một cây là một cây cao có thể sống trong một thời gian rất dài.Nó có một thân cây hoặc thân cây và các nhánh hỗ trợ lá.Bên dưới mặt đất, một cái cây có một hệ thống rễ hoạt động như một mỏ neo và lưu trữ nước và các chất dinh dưỡng mà nhà máy cần để phát triển.a tall plant that can live for a very long time. It has a single stem or trunk and branches that support leaves. Beneath the ground, a tree has a root system that acts as an anchor and stores the water and nutrients the plant needs to grow.

Cây trong mã hóa là gì?

Một cây là một tập hợp các thực thể gọi là các nút.Các nút được kết nối bởi các cạnh.Mỗi nút chứa một giá trị hoặc dữ liệu và nó có thể có hoặc không có nút con.Nút đầu tiên của cây được gọi là gốc.a collection of entities called nodes . Nodes are connected by edges . Each node contains a value or data , and it may or may not have a child node . The first node of the tree is called the root .

Biểu đồ cây vs là gì?

Biểu đồ là một tập hợp các đỉnh/nút và cạnh.A cây là một tập hợp các nút và cạnh.Trong biểu đồ, không có nút duy nhất được gọi là gốc.Trong một cái cây, có một nút duy nhất được gọi là gốc. A tree is a set of nodes and edges. In the graph, there is no unique node which is known as root. In a tree, there is a unique node which is known as root.