Tạo cây gia phả từ mảng dữ liệu (4 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

  • truongvu317

    Thành viên tích cực
    Tham gia
    15/11/10
    Bài viết
    955
    Được thích
    694
    Giới tính
    Nữ
    Vũ chào anh chị em! Vũ có một bài toàn muốn anh chị em làm giúp.
    Vũ có hai bảng dữ liệu như hình:
    1612771424785.png

    Bảng A( dữ liệu nguồn, có độ dài thay đổi):
    +Mô tả các thành viên trong một dòng họ
    +'Mỗi dòng mô tả một thành viên: gồm id, id anh,id con, id em
    +Id nhận giá trị >=0, và cột ID có thể không được xắp xếp, các id có thể không liên tiếp
    +id anh, id em, id con nhận giá trị -1 hoặc một trong các giá trị trong cột ID ( -1 mang ý nghĩa là không có)

    +Ví dụ với ID 7:
    -"ID anh bằng 6 tức là người này có một người anh ở trước ( với id=6), người này có thể có nhiều anh em
    -"ID con bằng 8 tức là người này có đứa con có id bằng 8
    -"ID em bằng -1, tức là người này không có em
    Hiện với bảng B sẽ cho biết các thông tin:
    '+0 có 3 người con là 1,6,7
    '+1 có 3 người con là 3,4,5
    '+6 không có con
    '+7 có 3 người con là 8,9,10
    10 là con cả, 9 là con hai, 8 con thứ 3

    Từ bảng A, mình muốn nhờ anh chị em viết code giúp cho, để được kết quả như bảng B.

    Vũ xin cảm ơn!
     

    File đính kèm

    Cấu trúc dữ liệu ngược. Một cha nhiều con thì con mang ID cha chứ không phải ngược lại như thế

    Dữ liệu chuẩn sẽ như sau:
    1612774575683.png
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Cấu trúc dữ liệu ngược. Một cha nhiều con thì con mang ID cha chứ không phải ngược lại như thế

    Dữ liệu chuẩn sẽ như sau:
    View attachment 254073
    vâng bác! Cha con mà biết mặt nhau thì nó dễ và dữ liệu của cháu thì cha chỉ biết mặt một thằng con, con thì không biết mặt cha, còn thằng con thì chỉ biết mặt của hai thằng anh em sau trước.
     
    Upvote 0
    1. Bảng A được điền theo qui luật nào?
    Một cha có thể có nhiều con. Vậy xét dòng bất kỳ thì ở cột id Con là con út, con giữa, hay con trưởng? Xét id 0 thì ở cột id Con là con trưởng, nhưng xét id 7 thì ở cột id Con là con út, còn id 1 thì ở cột id Con là con giữa.

    2. Cột id Anh là anh liền kề?

    3. Cột id Em là em liền kề?
     
    Upvote 0
    1. Bảng A được điền theo qui luật nào?
    Tôi cũng có 1 số câu hỏi hay hay:
    - Cha nhiều con thì ghi ID đứa nào?
    - Anh nhiều em thì ghi ID em nào?
    - Em nhiều anh thì ghi ID anh nào?
    - Vừa nhiều anh vừa nhiều em thì sao?
    - Không có anh, chỉ có chị thì có ghi vào đâu?
    Thế nên tôi đã gợi ý bảng dữ liệu chuẩn. Có thể thêm năm sinh để xác định lớn nhỏ trong anh chị em, cột giới tính để biết "anh" hay "chị", cột level để dễ viết code
     
    Upvote 0
    Tôi cũng có 1 số câu hỏi hay hay:
    - Cha nhiều con thì ghi ID đứa nào?
    - Anh nhiều em thì ghi ID em nào?
    - Em nhiều anh thì ghi ID anh nào?
    - Vừa nhiều anh vừa nhiều em thì sao?
    - Không có anh, chỉ có chị thì có ghi vào đâu?
    Thế nên tôi đã gợi ý bảng dữ liệu chuẩn. Có thể thêm năm sinh để xác định lớn nhỏ trong anh chị em, cột giới tính để biết "anh" hay "chị", cột level để dễ viết code
    Nhiều con hay ít thì cứ lấy con đầu, và anh/em thì lấy liền kề. Lúc đó lấy vị bất kỳ (id bất kỳ) thì ở cột id Con sẽ có con trưởng (trai gái như nhau, tức "id Anh" thì hiểu là "id Anh/Chị"). Từ con trưởng này nếu có em (em liền kề) thì lấy, rồi lại lấy em liền kề của em liền kề, cứ thế tới đứa em không có em liền kề (em út). Tất cả những người đó là con của vị có id kia.

    Tôi hỏi thế vì chủ thớt không nhất quá. Còn tham gia thì không muốn. Xem mọi người biểu diễn thôi. :D

    Nếu cho là con gái là con người ta thì trong gia phả không tính con gái. Và "id Anh" là "id Anh". :D
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Cha nhiều con thì ghi ID đứa nào?
    Ghi ngâu nhiên một đứa ( không có quy tắc xác định là người cha sẽ biết người con thứ mấy của mình), hay người cha chỉ biết là mình có con, tên của nó, chứ người cha cũng không ( trực tiếp) biết nó là con trưởng hay con út, muốn biết thì người cha đó phải hỏi người con đó ( thông qua việc đọc thông tin của người con đó).
    Anh nhiều em thì ghi ID em nào?
    Người anh chỉ biết đứa em liền kề của mình. Giả sử A->B->c, A chỉ biết mình có người em là B, không biết mình có người em C hay không, muốn biết thì A phải hỏi B xem B có em nữa không?
    Em nhiều anh thì ghi ID anh nào?
    Người em chỉ biết người anh liền kê của mình. Giả sử A->b->C, C chỉ biết mình có anh là B, không biết mình có người anh là A hay không, phải hỏi B thì mới biết đến A.
    Vừa nhiều anh vừa nhiều em thì sao?
    Một người có thể có nhiều anh chị em, nhưng người đó chỉ biết người em liền kề và người anh liên kề.
    Không có anh, chỉ có chị thì có ghi vào đâu?
    Thực ra ở đây không có khái niệm anh chị, hay là không phân biệt giới tính, chỉ phân biệt là đẻ trước hay đẻ sau. anh chị được coi là đẻ trước, em là đẻ sau.


    ===> Hiểu nôm na là một lớp có một nhóm học sinh, các học sinh này cầm tay nhau và xếp thẳng hàng. một học sinh chỉ biết bạn bên trái và bạn bên phải của mình. học sinh cũng không biết là cô giáo của mình là ai, chi có cô giáo là biết một học sinh nào đó trong nhom học sinh kia. Tất nhiên là cái của cháu nó có thể có nhiều cấp hơn so với mô hình học sinh trên.
    Bài đã được tự động gộp:

    Từ con trưởng này nếu có em (em liền kề) thì lấy, rồi lại lấy em liền kề của em liền kề, cứ thế tới đứa em không có em liền kề (em út). Tất cả những người đó là con của vị có id kia.
    Chỗ này bác nói chuẩn nhưng id mà người cha có thì không nhất thiết là con trưởng vì vậy phải thêm khâu đi tìm con trưởng, rồi từ đó đi tìm các đàn em của nó.
    Bài đã được tự động gộp:

    Vậy xét dòng bất kỳ thì ở cột id Con là con út, con giữa, hay con trưởng
    id đó có thể là bất kỳ đứa con nào.
    Bài đã được tự động gộp:

    Nếu cho là con gái là con người ta thì trong gia phả không tính con gái. Và "id Anh" là "id Anh".
    "thị nở" hay "chí phéo" đều được, id anh không bao hàm giới tính bác ạ.
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Chỗ này bác nói chuẩn nhưng id mà người cha có thì không nhất thiết là con trưởng vì vậy phải thêm khâu đi tìm con trưởng, rồi từ đó đi tìm các đàn em của nó.
    Bài đã được tự động gộp:
    Nếu thế thì từ id bất kỳ có được id Con. Từ id Con này tìm các id Anh liên tiếp cho tới id nào đó không có id Anh thì dừng. Đó là anh đầu.Từ id Con kia cũng tìm các em liền kề liên tiếp cho tới em út. Tức trong trường hợp này xuất phát từ id Con phải tìm theo 2 hướng mới có tất cả anh chị em, tức các con của id ban đầu.
     
    Upvote 0
    Cái thớt muốn là kiểu biến thể cây nhị phân theo dạng một cha nhiều con. (Cây nhị phân lý thuyết một cha chỉ có hai con)
    Một gút (node) chỉ có dữ liệu cá nhân, và hai con trỏ. Con trỏ thứ nhất chỉ đứa con đầu lòng. Con trỏ thứ hai chỉ vào đứa em kế mình. Không có (chưa có con, con út) thì con trỏ là Null (ở đây là -1).
    Vì để dễ truy vấn, dạng cây này lại được chế biến thêm 1 con trỏ thứ ba để truy vấn ngược. Con trỏ thứ ba này đáng lẽ phải được định nghĩa là "ID Cha hoặc Anh". Khi truy vấn ngược, nếu node kia có ID Con bằng nó thì nó là con trưởng và node kia là cha nó.
    (kể từ lúc CSDL Liên Hệ phổ biến thì loại cây này rất ít dùng nên tôi chỉ nhớ mang máng. Có gì sai sót, xin quý vị cứ bổ túc)

    Cấu trúc đề nghị ở bài #2 là dạng cây nhiều nhánh. Dùng cho CSDL Liên Hệ.

    (*) vì tiếng Việt không có từ dịch thẳng parent và sibling nên tôi dùng tạm cha-anh cho gọn. Không phải phân biệt nam nữ gì hết. Những chỗ Cha-Anh xin đọc là Cha/Mẹ-Anh/Chị

    (**) hoạt động của CSDL Liên Hệ rất tốn tài nguyên. Cho đến khoảng giữa thập niên 80's thì nó vẫn chỉ dùng được trong các hệ thống rất xịn.
    Cấu trúc của CSDL thời đó hầu hết dựa trên trật tự từ trên xuống và mạng lưới con trỏ.
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Việc lập cây thì có thể dùng giải thuật tương tự như dò directory để xếp files.
    Chỉ khác là ở đây, anh chị em không nằm chung một khối cho nên phải dùng đệ quy rẽ nhánh, khá phức tạp.
    Theo tôi thì dùng cách dò ngược, lập một list full path (cách trâu bò cho dễ), rồi sort ra.
     
    Upvote 0
    Vũ chào anh chị em! Vũ có một bài toàn muốn anh chị em làm giúp.
    Vũ có hai bảng dữ liệu như hình:
    View attachment 254070

    Bảng A( dữ liệu nguồn, có độ dài thay đổi):
    +Mô tả các thành viên trong một dòng họ
    +'Mỗi dòng mô tả một thành viên: gồm id, id anh,id con, id em
    +Id nhận giá trị >=0, và cột ID có thể không được xắp xếp, các id có thể không liên tiếp
    +id anh, id em, id con nhận giá trị -1 hoặc một trong các giá trị trong cột ID ( -1 mang ý nghĩa là không có)

    +Ví dụ với ID 7:
    -"ID anh bằng 6 tức là người này có một người anh ở trước ( với id=6), người này có thể có nhiều anh em
    -"ID con bằng 8 tức là người này có đứa con có id bằng 8
    -"ID em bằng -1, tức là người này không có em
    Hiện với bảng B sẽ cho biết các thông tin:
    '+0 có 3 người con là 1,6,7
    '+1 có 3 người con là 3,4,5
    '+6 không có con
    '+7 có 3 người con là 8,9,10
    10 là con cả, 9 là con hai, 8 con thứ 3

    Từ bảng A, mình muốn nhờ anh chị em viết code giúp cho, để được kết quả như bảng B.

    Vũ xin cảm ơn!
    Dữ liệu nằm tít ở dưới kỳ cục quá, đẩy lên dòng 5
    Giới hạn 100 đời, dòng đầu phải là ông tổ đứng đầu dòng tộc, đưa người khác lên đầu là phạm thượng kết quả code sai tè le
    Xếp thứ tự "trưởng" "thứ" tốn khá nhiều dòng lệnh
    Chưa kiểm tra hết các tình huống dữ liệu
    Mã:
    Sub XYZ()
      Dim sArr(), Res(), Dic As Object, sRow&, i&, k&
      Dim cha$, anh$, con$, em$, tmp$, iKey, AnhEm
     
      sArr = Range("D5", Range("G1000000").End(xlUp)).Value
      sRow = UBound(sArr)
      Set Dic = CreateObject("Scripting.Dictionary")
      For i = 1 To sRow
        cha = sArr(i, 1): anh = sArr(i, 2): con = sArr(i, 3): em = sArr(i, 4)
        If con <> "-1" Then
          If Dic.exists(cha) = False Then
            Dic.Item(cha) = "," & con & ","
          Else
            Dic.Item(cha) = Dic.Item(cha) & con & ","
          End If
          Dic.Add "Cha cua" & con, cha
          
          iKey = Dic.Item("Cha cua" & cha) 'Cha cua Anh Em
          tmp = Dic.Item(iKey) 'Anh em cua Anh em
          If anh <> "-1" Then
            If InStr(1, tmp, anh) = 0 Then
              tmp = Replace(tmp, "," & cha & ",", "," & anh & "," & cha & ",")
              Dic.Item(iKey) = tmp
              Dic.Item("Cha cua" & anh) = iKey
            End If
          End If
          If em <> "-1" Then
            If InStr(1, tmp, em) = 0 Then
              tmp = Replace(tmp, "," & cha & ",", "," & cha & "," & em & ",")
              Dic.Item(iKey) = tmp
              Dic.Item("Cha cua" & em) = iKey
            End If
          End If
        Else
          If Dic.exists("Cha cua" & cha) Then
            iKey = Dic.Item("Cha cua" & cha) 'Cha cua Anh Em
            AnhEm = cha
          ElseIf Dic.exists("Cha cua" & anh) Then
            iKey = Dic.Item("Cha cua" & anh) 'Cha cua Anh Em
            AnhEm = anh
          Else
            iKey = Dic.Item("Cha cua" & em) 'Cha cua Anh Em
            AnhEm = em
          End If
          
          tmp = Dic.Item(iKey) 'Anh em cua Anh em
          If anh <> "-1" Then
            If InStr(1, tmp, anh) = 0 Then
              tmp = Replace(tmp, "," & AnhEm & ",", "," & anh & "," & AnhEm & ",")
              Dic.Item("Cha cua" & anh) = iKey
            End If
          End If
          If em <> "-1" Then
            If InStr(1, tmp, em) = 0 Then
              tmp = Replace(tmp, "," & AnhEm & ",", "," & AnhEm & "," & em & ",")
              Dic.Item("Cha cua" & em) = iKey
            End If
          End If
          Dic.Item(iKey) = tmp
        End If
      Next i
     
      ReDim Res(1 To sRow, 1 To 100) 'Toi Da 100 cot
      k = 1
      Call AddRes(Res, Dic, k, sArr(1, 1), 1)
      Range("K4").Resize(sRow, 100) = Res
    End Sub
    
    Private Sub AddRes(Res, Dic, k, ByVal iKey$, ByVal jC&)
      Dim S, tem
      Res(k, jC) = iKey
      If Dic.exists(iKey) Then
        S = Split(Dic.Item(iKey), ",")
        For i = 1 To UBound(S) - 1
          Call AddRes(Res, Dic, k, S(i), jC + 1)
        Next i
      Else
        k = k + 1
      End If
    End Sub
     

    File đính kèm

    Upvote 0
    Giải thuật của tôi sẽ như vầy:
    (lưu ý là trong gia phả này, người có bậc số cao nhất là người cháu thấp nhất. Vì vậy để tránh nhầm lẫn, tôi chỉ dùng bậc số)

    Global: trong module chung
    - Dim 4 ranges để search ID's, mỗi range là một cột của bảng B: rgID, rgPS, rgCH, rgNS
    - - PS: previous sibling/anh, CH: child/con, NS: next sibling/em)
    - Dim A, B()

    Hàm chính:
    - Xác định 4 ranges để search (Set ... = Range(...))
    - Copy bảng A vào mảng A, chép dư 1 cột để chuẩn hoá
    - gọi hàm ChenIDCha
    - Redim B1((số ID nhỏ nhất) To (số ID lớn nhất), 1 To 3)
    - Vòng lặp duyệt rgID, mỗi cell (cll):
    - - Gọi CopyTuEm
    - - Nếu không có trị trả về:
    - - - Gọi CopyTuAnh
    - Lấy trị trả về, cộng thêm ID của node này và ghi vào cột 3 mảng B
    - Hết vòng lặp
    - Lập một mảng C(1 To (số người), 1 To 2)
    - Vòng lặp duyệt mảng B
    - - tách trị số ra ông tổ, ông nội, cha..., nếu ra nhiều cột hơn UBound(C, 2) thì Redim Preserve C
    - - chép hết vào dòng kế mảng C
    - Hết vòng lặp
    - Chép mảng C xuống bảng B
    - Sort bảng B
    - Ghi tiêu đề bảng B
    - Hết hàm chính

    Hàm ChenIDCha
    ' chuẩn hoá mảng A thành dạng như bài #9. Tuy mất công nhưng sẽ giúp cho các hàm khác dễ code hơn
    - Vòng lặp duyệt mảng A
    - chép số dòng vào chỉ số tương ứng trong B, cột 1 (mục đích để tra cứu dòng nhanh hơn)
    - với mỗi dòng, nếu có ID Anh là -1:
    - - duyệt cột ID Con để tìm ID này.
    - - nếu không thấy thì nó là ông tổ. Chép -1 vào cột 2 của B
    - - nếu thấy thì dòng này là cha của dòng hiện tại: chép ID cha tìm được vào cột 2 của B
    - Hết vòng lặp
    ' như vậy nếu một dòng trong mảng A có ID Anh là -1 thì nó có thể tìm được trong mảng B để lấy ID Cha
    Hết hàm

    Hàm CopyTuEm
    ' chạy ngang theo nhánh Em, copy chi nếu có
    - Duyệt theo con trỏ Em, nếu node nào có trị ở cột 3 trong B thì trả về trị này
    Hết hàm

    Hàm CopyTuAnh
    ' chạy ngang theo con trỏ Anh, nếu node nào có trị ở cột B thì copy
    - Nếu con trỏ Anh không có, thì dựa vào B để tìm cha, và gọi hàm CopyTuCha, và thoát hàm
    - Duyệt theo con trỏ Anh, nếu node nào có trị ở cột 3 trong B thì trả về trị này, và thoát hàm
    Hết hàm

    Hàm CopyTuCha
    Gọi CopyTuEm
    Nếu không có trị trả về:
    - Gọi CopyTuAnh
    Trả về trị, cộng thêm ID của Cha này.
    Hết hàm

    Đại khái là vậy
     
    Upvote 0
    Chủ thớt nên thêm dữ liệu đa dạng để mọi người có cái để test. Code viết chay không thể đúng ngay được.
    Nên thêm cấp 4, cấp 5 chẳng hạn, cho id 4 và id 5 có con cháu. Sau cùng điền kết quả bằng tay vào cột K:... để mọi người chạy code và so sánh với kết quả mong đợi.
     
    Upvote 0
    Dữ liệu nằm tít ở dưới kỳ cục quá, đẩy lên dòng 5
    Cảm ơn bạn đã code, mình tải file về chạy thì đúng kết quả như bảng B.
    1612883962048.png

    Theo bảng dữ liệu cũ thì người số 3 không có con, mình sửa dữ liệu như hình với ý nghĩa là: người số 3 bây giờ có một người con là người số 11, người số 11 không có anh, không có em, khi chạy code thì được như hình. Mình cảm thấy gần về tới đích, còn xíu nữa thôi.
     
    Upvote 0
    Bạn không muốn làm theo yêu cầu của tôi thì thôi cũng được.
    Do đã chót tham gia nên tôi đành bỏ công ra để nhìn hình và tạo thêm, sửa dữ liệu. Không có kết quả mong muốn để so sánh, kiểm tra thì vẫn tự kiểm tra được, nhọc hơn thôi.

    Tôi đưa giải pháp của tôi. Được hay không tôi cũng sẽ dừng ở đây.
    Dữ liệu từ D5:G5 trở xuống. Code chưa xóa kết quả cũ.
    Mã:
    Sub XulyID(ByVal curr_id As Long, ByVal id As Object, ByVal sh As Worksheet, curr_row As Long, ByVal curr_col As Long)
    Dim item
        item = id.item(curr_id)
        If item(2) > -1 Then
            sh.Cells(curr_row, curr_col + 1).Value = item(2)
            XulyID item(2), id, sh, curr_row, curr_col + 1
        End If
        If item(3) > -1 Then
            curr_row = curr_row + 1
            sh.Cells(curr_row, curr_col).Value = item(3)
            XulyID item(3), id, sh, curr_row, curr_col
        End If
    End Sub
    
    Sub test()
    Dim lastRow As Long, r As Long, c As Long, id_ongto As Long, id_con As Long, id_anh As Long, curr_row As Long, curr_col As Long, key, item, dulieu(), id As Object, sh As Worksheet
        Set sh = ThisWorkbook.Worksheets("Sheet1")
        With sh
            lastRow = .Cells(Rows.Count, "D").End(xlUp).Row
            If lastRow < 6 Then Exit Sub
            dulieu = .Range("D5:G" & lastRow).Value
        End With
        id_ongto = dulieu(1, 1)
        Set id = CreateObject("Scripting.Dictionary")
        For r = 1 To UBound(dulieu, 1)
            If Not id.exists(dulieu(r, 1)) Then
                ReDim item(1 To 3)
                For c = 1 To 3
                    item(c) = dulieu(r, c + 1)
                Next c
                id.Add dulieu(r, 1), item
            End If
        Next r
        For Each key In id.keys
            item = id.item(key)
            id_con = item(2)
            Do While id_con > -1
                id_anh = id.item(id_con)(1)
                If id_anh > -1 Then
                    id_con = id_anh
                Else
                    Exit Do
                End If
                item(2) = id_con
                id.item(key) = item
            Loop
        Next key
      
        curr_row = 4
        curr_col = 11
        sh.Cells(curr_row, curr_col).Value = id_ongto
        XulyID id_ongto, id, sh, curr_row, curr_col
        Set id = Nothing
    End Sub
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Cảm ơn bạn đã code, mình tải file về chạy thì đúng kết quả như bảng B.
    View attachment 254126

    Theo bảng dữ liệu cũ thì người số 3 không có con, mình sửa dữ liệu như hình với ý nghĩa là: người số 3 bây giờ có một người con là người số 11, người số 11 không có anh, không có em, khi chạy code thì được như hình. Mình cảm thấy gần về tới đích, còn xíu nữa thôi.
    Vẫn giải thuật code trước, tinh chỉnh lại các lệnh
    Mã:
    Sub XYZ()
      Dim sArr(), Res(), Dic As Object, i&, j&, k&
      Dim Cha$, Con$, ConMoi$, tmp$
     
      sArr = Range("D5", Range("G1000000").End(xlUp)).Value
      Set Dic = CreateObject("Scripting.Dictionary")
      For i = 1 To UBound(sArr)
        Cha = sArr(i, 1): Con = sArr(i, 3)
        If Con <> "-1" Then
          Dic.item(Cha) = Dic.item(Cha) & Con & "," ' Cha ==> các Con
          Dic.Add "Cha cua" & Con, Cha ' Con ==> Cha
        End If
        
        For j = 1 To 4 'Anh <==> Em
          If j = 3 Then j = 4
          If Dic.exists("Cha cua" & sArr(i, j)) Then
            Cha = Dic.item("Cha cua" & sArr(i, j)) 'Cha cua Anh Em
            tmp = "," & Dic.item(Cha) 'Cac Con
            Con = sArr(i, j)
            Exit For
          End If
        Next j
        For j = 2 To 4 Step 2
          ConMoi = sArr(i, j)
          If ConMoi <> "-1" Then
            If InStr(1, tmp, "," & ConMoi & ",") = 0 Then 'Con moi
              If j = 2 Then ConMoi = ConMoi & "," & Con Else ConMoi = Con & "," & ConMoi
              tmp = Replace(tmp, "," & Con & ",", "," & ConMoi & ",") 'Them Con moi
              Dic.item(Cha) = Mid(tmp, 2, Len(tmp)) 'Them Con moi cho Cha
              Dic.item("Cha cua" & sArr(i, j)) = Cha
            End If
          End If
        Next j
      Next i
     
      ReDim Res(1 To UBound(sArr), 1 To 100) 'Toi Da 100 cot
      Call AddRes(Res, Dic, k, sArr(1, 1), 1)
      Range("K4").Resize(k, 100) = Res
    End Sub
    
    Private Sub AddRes(Res, Dic, k, ByVal iKey$, ByVal jC&)
      Dim S, i&
      Res(k + 1, jC) = iKey
      If Dic.exists(iKey) Then
        S = Split(Dic.item(iKey), ",")
        For i = 0 To UBound(S) - 1
          Call AddRes(Res, Dic, k, S(i), jC + 1)
        Next i
      Else
        k = k + 1
      End If
    End Sub
     
    Upvote 0
    cây nhị phân theo dạng một cha nhiều con. (Cây nhị phân lý thuyế
    Dạ cái cháu đang làm đúng là cấu trúc cây, tên cháu tạm dịch là "cây đỏ đen". Code do bác @batman1@HieuCD viết thì đúng là đã chạy ra kết quả như mong muốn cháu từng để cập. Và thật là không vui khi cháu dịch chưa đúng tài liệu tiếng anh phần mô tả. Cụ thể là id anh sẽ trỏ vào một id khác. Id khác này lại trỏ vào 2 người khác. 4người này gọi là anh em vois nhau, dựa vào code mẫu của bác @batman1 và bác hieucd cháu đã chỉnh lại và chạy được rồi. Mấy ngày nay không dám vào thớt này vì sợ các bác không yêu, hihi
     
    Upvote 0
    Dạ cái cháu đang làm đúng là cấu trúc cây, ...
    Phần lớn giải thuật làm việc với cấu trúc cây liên quan đến đệ quy. Nếu code không đệ quy thì lô gic cũng là đệ quy.

    Như giải thuật ở bài #12:
    - hàm CopyTuEm có tính chất đệ quy tuyến tính
    - hai hàm CopyTuAnh và CopyTuCha đệ quy chéo (gọi lẫn nhau)
     
    Upvote 0
    Web KT

    Bài viết mới nhất

    Back
    Top Bottom