Tạo cây gia phả từ mảng dữ liệu

Liên hệ QC

truongvu317

Thành viên tích cực
Tham gia
15/11/10
Bài viết
943
Được thích
685
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

  • GPE.xls
    72 KB · Đọc: 8
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

  • Loc.xlsm
    22.7 KB · Đọc: 27
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