O (n1 * log (n2)) là trường hợp trung bình ngay cả khi chúng tôi có 2 hợp nhất bất kỳ danh sách chưa được phân loại nào vào BST. Chúng tôi không sử dụng thực tế là danh sách được sắp xếp danh sách hoặc BST.
Theo tôi Giả sử BST có phần tử n1 và phần tử khác có phần tử n2. Bây giờ chuyển đổi một BST thành một danh sách mảng sắp xếp L1 trong O (n1).
Merged BST (BST, Array)
if (Array.size == 0) return BST if (Array.size == 1) chèn phần tử trong BST. trả về BST;
Tìm chỉ mục trong mảng có phần tử bên trái < BST.rootnode và phần tử bên phải> = BST.rootnode nói chỉ mục. if (BST.rootNode.leftNode == null) // tức là Không có nút trái { chèn tất cả các mảng từ chỉ số 0 vào bên trái của BST và } khác { Merged BST (BST.leftNode, Array { 0 đến Index}) }
if (BST.rootNode.rightNode == null) // tức là Không có nút ngay { chèn tất cả các mảng từ Index để Array.size vào bên phải của BST } khác { BST được hợp nhất (BST.rightNode, Array {Index to Array.size}) }
trả lại BST.
Thuật toán này sẽ mất < < thời gian hơn O (n1 * log (n2)) như mỗi lần chúng tôi phân vùng mảng và BST để xử lý các vấn đề con.
Chèn gốc của cây 1 vào cây 2 sẽ không hoạt động trong mọi trường hợp. –
Bạn đang giả định rằng tất cả các cây tìm kiếm nhị phân đều được cân bằng. (Ví dụ: cây Splay không phải là) Ngoài ra tôi nghĩ rằng sự phức tạp của bạn hơi giảm đi. Bởi vì n2 đang tăng lên, cây sẽ trở nên sâu hơn khi bạn chèn các giá trị. Có lẽ (n1 + n2)/2 là một xấp xỉ tốt hơn (Bởi vì lúc bắt đầu chèn nó là O (log n2) để chèn vào và cuối cùng nó là O (log (n1 + n2)) – jabbie
@Evan Teran, Ví dụ: <-c-> h union b <-d-> f, phạm vi của chúng [a, h] và [b, f] trùng nhau và do đó không thể chèn vào một nút khác làm nút lá –