Điều này có thể được giải quyết một cách tốt hơn. Ngoài ra, chúng ta có thể giảm độ phức tạp thời gian xuống O (n) bằng một sửa đổi nhỏ trong cấu trúc dữ liệu và sử dụng phương pháp lặp. Để phân tích chi tiết và nhiều cách giải quyết vấn đề này với các cấu trúc dữ liệu khác nhau.
Đây là một bản tóm tắt về những gì tôi muốn giải thích trong một bài đăng trên blog của tôi :
Phương pháp đệ quy - Đường kính cây
Một cách khác để tiếp cận vấn đề này như sau. Như chúng tôi đã đề cập ở trên rằng đường kính có thể
- nằm hoàn toàn trong cây con bên trái hoặc
- hoàn toàn nằm trong cây con bên phải hoặc
- có thể kéo dài qua gốc
Điều đó có nghĩa là đường kính có thể được dẫn xuất lý tưởng bởi
- đường kính của cây bên trái hoặc
- đường kính của cây bên phải hoặc
- chiều cao của cây con bên trái + chiều cao của cây con bên phải + 1 (1 để thêm nút gốc khi đường kính kéo dài qua nút gốc)
Và chúng ta biết rằng đường kính là con đường dài nhất, vì vậy chúng ta lấy tối đa 1 và 2 trong trường hợp nó nằm ở một trong hai bên hoặc một nửa mất 3 nếu nó đi qua gốc.
Phương pháp lặp - Đường kính cây
Chúng ta có một cây, chúng ta cần một thông tin meta với mỗi nút để mỗi nút biết sau:
- Chiều cao của đứa con bên trái của nó,
- Chiều cao của đứa con phải và
- Khoảng cách xa nhất giữa các nút lá của nó.
Khi mỗi nút có thông tin này, chúng ta cần một biến tạm thời để theo dõi đường dẫn tối đa. Vào thời điểm thuật toán kết thúc, chúng ta có giá trị đường kính trong biến tạm thời.
Bây giờ, chúng ta cần giải quyết vấn đề này theo cách tiếp cận từ dưới lên, bởi vì chúng ta không có ý tưởng nào về ba giá trị cho gốc. Nhưng chúng tôi biết những giá trị cho lá.
Các bước để giải quyết
- Khởi tạo tất cả các lá với tráiHeight và rightHeight là 1.
- Khởi tạo tất cả các lá với maxDistance là 0, chúng ta xác định rằng nếu một trong hai bên trái hoặc bên phải là 1, chúng ta tạo maxDistance = 0
- Di chuyển lên trên một lần và tính các giá trị cho cha mẹ ngay lập tức. Nó sẽ dễ dàng bởi vì bây giờ chúng tôi biết những giá trị này cho trẻ em.
Tại một nút cho trước,
- chỉ định bên trái tối đa là (bên trái hoặc bên phải của bên trái của nó).
- chỉ định mức tối đa bên phải tối đa (bên trái hoặc bên phải của con bên phải).
- nếu bất kỳ giá trị nào trong số này (leftHeight hoặc rightHeight) là 1, hãy tạo maxDistance thành 0.
- nếu cả hai giá trị đều lớn hơn 0, hãy tạo maxDistance là leftHeight + rightHeight - 1
- Duy trì maxDistance trong biến temp và nếu ở bước 4, maxDistance lớn hơn giá trị hiện tại của biến, hãy thay thế nó bằng giá trị maxDistance mới.
- Vào cuối thuật toán, giá trị trong maxDistance là đường kính.