2013-11-24 17 views
5

Trong cuốn sách Giới thiệu về thuật toán - Cách tiếp cận sáng tạo, Câu hỏi 4,24:Chứng minh số lượng tối đa quay cho hai cây để trở thành bình đẳng

Hãy T1 và T2 là hai cây tùy ý, mỗi n có nút . Chứng minh rằng nó đủ để áp dụng tối đa 2n vòng quay đến T1, sao cho nó trở thành bằng T2.

Đối với cây tìm kiếm nhị phân, tôi đã tìm ra một thuật toán:

  1. Tìm các yếu tố tương đương với gốc T2 của, chúng ta hãy gọi nó là nhắm mục tiêu-root.

  2. Sử dụng chiến lược xoay vòng AVL, xoay mục tiêu gốc để biến nó thành gốc mới của T1.
    Trong quá trình này, nhiều phép quay có thể được thực hiện.

  3. Đối với cây con bên trái của T1 và T2, xử lý chúng như trên đệ quy.
    Đối với cây con phải của T1 và T2, xử lý chúng như trên đệ quy.

Thuật toán này, trong trường hợp xấu nhất, chạy trong O (N^2).

Tôi không hiểu cụm từ "cây bất kỳ" và tôi không thể tìm ra cách để T1 bằng T2.

Có ai có thể giúp về câu hỏi này không?

+1

Tôi không biết có câu trả lời đơn giản nào không. Tôi nghĩ bài báo này là một điểm khởi đầu tốt. Daniel Sleator, Robert Tarjan và William Thurston cho thấy khoảng cách quay giữa hai cây n-nút (đối với n ≥ 11) tối đa là 2n - 6, và vô số cặp cây này cách xa nhau. http://www.ams.org/journals/jams/1988-01-03/S0894-0347-1988-0928904-4/home.html – amald

+0

@amald cảm ơn, tôi sẽ đọc bài báo – Guocheng

Trả lời

0

Từ bất cứ điều gì tôi đã nhận tôi có thể đề xuất một thuật toán có thể giải quyết vấn đề này trong thời gian O (N) quay nhưng không thể có được sự chính xác trên ràng buộc nhưng nghĩ rằng bạn có thể xây dựng về vấn đề này: -

Đây là mã giả cho thuật toán: -

//Method to make T1 equivalent to T2 

    alignTree(T1,T2) { 

    if(length(T1)==1) 
     return 

    else { 

     Node k = FindRoot(T1,T2) 
     rotateAbout(k) 
     align(T1.left,T2.left) 
     align(T1.right,T2.right) 
    } 


    } 

Giả sử FindRoot tìm thấy nút của T1 được coi là gốc của cây mới là cây tương đương. Giả sử rotateAbout(K) làm cho vòng quay thích hợp thành gốc để có các nút tương đương trên các nhánh trái và phải của cây mới. Sau đó, chúng tôi có thể giải quyết đệ quy cho các vấn đề phụ nhỏ hơn trên các subtrees nhỏ hơn.

Số Xoay: Như bạn thấy trong mã giả những không quay tương đương với pre-order traversal của cây đó là O(N)

Lưu ý: Bạn luôn có thể mở rộng mã giả trên cho cây chung và vẫn nhận được sự phức tạp tương tự.

+0

Tôi không nghĩ là xoay vòng (K) mất thời gian không đổi. giả sử T1 là một cây được tạo ra bằng cách chèn 10,9,8,7,6,5,4,3,2,1, và T2 là một cây được tạo ra bằng cách chèn 1,2,3,4,5, 6,7,8,9,10. Sau đó, đầu tiên chúng ta nên xoayGiới thiệu (1), phải mất 9 bước nếu chúng ta sử dụng xoay đơn (xoay vòng đơn AVL). – Guocheng

+0

@Guocheng Ở đây trong khi sắp xếp hai cây chúng ta không khớp với các phím của cây nhưng chỉ cấu trúc của hai cây phải giống nhau nên gốc sẽ luôn là nút có cùng các nút ở bên trái và bên phải làm cây thứ hai. Hơn nữa, chúng tôi không tính toán độ phức tạp thời gian của thuật toán ở đây nhưng chỉ không có phép quay cần thiết để căn chỉnh cây. –

+0

Vậy làm cách nào để chúng tôi quyết định nút gốc mới của T1 và cách xoay để đảm bảo rằng cây con có các nút số bằng nhau? – Guocheng

Các vấn đề liên quan