Đặt hàng trước + đặt hàng sau để đặt hàng


11

Bài tập

Đưa ra các giao dịch đặt hàng trước và sau đơn hàng của cây nhị phân đầy đủ, trả về giao dịch theo thứ tự của nó.

Các giao dịch sẽ được biểu diễn dưới dạng hai danh sách, cả hai đều chứa n số nguyên dương khác nhau, mỗi số xác định duy nhất một nút. Chương trình của bạn có thể lấy các danh sách này và đưa ra kết quả theo thứ tự kết quả, sử dụng bất kỳ định dạng I / O hợp lý nào.

Bạn có thể cho rằng đầu vào là hợp lệ (nghĩa là các danh sách thực sự đại diện cho các giao dịch của một số cây).

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

Các định nghĩa

Một cây nhị phân đầy đủ là một cấu trúc hữu hạn các nút , đại diện ở đây bởi nguyên dương độc đáo.

Cây nhị phân đầy đủ là một , bao gồm một nút duy nhất :

                                      1

Hoặc một nhánh , bao gồm một nút có hai cây con (được gọi là cây con tráiphải ), mỗi nhánh lần lượt là một cây nhị phân đầy đủ:

                                      1
                                    /   \
                                  …       …

Đây là một ví dụ đầy đủ về cây nhị phân đầy đủ:

                                        6
                                      /   \
                                    3       4
                                   / \     / \
                                  1   8   5   7
                                     / \
                                    2   9

Giao dịch đặt hàng trước của cây nhị phân đầy đủ được định nghĩa đệ quy như sau:

  • Truyền tải theo thứ tự trước của một chứa nút n là danh sách [ n ].
  • Truyền tải theo thứ tự trước của một nhánh chứa một nút n và các cây con (L, R) là danh sách [ n ] +  preorder ( L ) +  preorder ( R ), trong đó + là toán tử nối danh sách.

Đối với cây trên, đó là [6, 3, 1, 8, 2, 9, 4, 5, 7] .


Truyền tải sau đơn đặt hàng của cây nhị phân đầy đủ được định nghĩa đệ quy như sau:

  • Truyền tải theo thứ tự sau của một chứa nút n là danh sách [ n ].
  • Truyền tải theo thứ tự sau của một nhánh chứa một nút n và các cây con (L, R) là danh sách postorder ( L ) +  postorder ( R ) + [ n ].

Đối với cây trên, đó là [1, 2, 9, 8, 3, 5, 7, 4, 6] .


Truyền tải theo thứ tự của cây nhị phân đầy đủ được định nghĩa đệ quy như sau:

  • Truyền tải theo thứ tự của một chiếc lá chứa nút n là danh sách [ n ].
  • Truyền tải theo thứ tự của một nhánh chứa một nút n và các cây con (L, R) là danh sách inorder ( L ) + [ n ] +  inorder ( R ).

Đối với cây trên, đó là [1, 3, 2, 8, 9, 6, 5, 4, 7] .


Tóm lại: đưa ra cặp danh sách [6, 3, 1, 8, 2, 9, 4, 5, 7] (trước) và [1, 2, 9, 8, 3, 5, 7, 4, 6] (bài) làm đầu vào, chương trình của bạn sẽ xuất [1, 3, 2, 8, 9, 6, 5, 4, 7] .

Các trường hợp thử nghiệm

Mỗi trường hợp thử nghiệm là trong định dạng preorder, postorder → expected output.

[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]

Vì đầu vào được đảm bảo có hình dạng cụ thể (cây nhị phân hoàn chỉnh), bạn không thực sự cần cả hai đầu vào, phải không?
frageum

Cây nhị phân đã đầy , nhưng không đầy đủ , vì vậy cây n có thể có nhiều hình dạng và nói chung, bạn cần cả hai.
Lynn

Tôi có thể biểu diễn các nút dưới dạng các chữ cái đơn cho chuỗi cho các đơn đặt hàng. Ví dụ, ví dụ thứ hai sẽ trở thành : "CDE" and "DEC" give "DCE"? (thậm chí sử dụng các chữ cái unicode nếu tôi cần nhiều nút)
TonMedel

@TonH rửa mặt Tôi sẽ ổn với điều đó - có thể nói, tất cả những gì bạn đang làm là kéo dài định nghĩa về danh sách các số nguyên một chút, bởi vì "CDE"không khác lắm so với [67, 68, 69]:)
Lynn

Câu trả lời:


2

Perl, 69 66 62 56 53 byte

Bao gồm +1 cho -p

Đưa bưu điện theo sau là đặt hàng trước như một dòng cách nhau bởi khoảng trắng trên STDIN (chú ý thứ tự trước và sau). Các nút được thể hiện dưới dạng các chữ cái duy nhất (bất kỳ ký tự nào không phải là khoảng trắng hoặc dòng mới là OK).

inpost.pl <<< "98231 12983"

inpost.pl:

#!/usr/bin/perl -p
s%(.)(.)+\K(.)(.+)\3(\1.*)\2%$4$5$3$2%&&redo;s;.+ ;;

Sử dụng định dạng số thuần túy ban đầu cần nhiều sự cẩn thận hơn để xác định chính xác một số duy nhất và có 73 byte

#!/usr/bin/perl -p
s%\b(\d+)(,\d+)+\K,(\d+\b)(.+)\b\3,(\1\b.*)\2\b%$4$5,$3$2%&&redo;s;.+ ;;

Sử dụng như là

inpostnum.pl <<< "11,12,10,2,8,4,5,3,7 7,8,10,11,12,2,3,4,5"

-pthêm một ;ở cuối, vì vậy bạn không cần cuối cùng ;. s;.* ;;->s;.* ;
Riley

@Riley tôi biết. Đó là lý do tại sao tôi có ;cuối cùng. Nhưng -p thực sự thêm \n;vào cuối trong một -echương trình. Trong một tệp, nó chỉ thêm ;khi và chỉ khi tệp không kết thúc \n. Vì tôi muốn xác nhận -plà +1 chứ không phải +3, chương trình cần phải hoạt động từ dòng lệnh, vì vậy với -e. Và tôi không muốn dòng mới giả trong sản phẩm mà sau đó tôi sẽ nhận được
TonMedel

Nếu bạn chạy nó trên dòng lệnh bạn không cần 'xung quanh nó? Nếu bạn chạy nó theo cách bạn có nó (gọi một tệp với <<<), bạn có thể để lại lần cuối ;.
Riley

@Riley Nó phụ thuộc vào việc giải thích phương pháp tính điểm cho perl. Tôi thường gửi mã của mình dưới dạng tệp vì tôi nghĩ rằng đó là ít phù du. Nhưng nếu bạn nhìn vào bài nộp của tôi, bạn sẽ thấy rằng nếu mã phải nằm trong một tệp (vì ví dụ: nó có 'hoặc sử dụng, do$0v.v.) Tôi luôn ghi điểm -plà +3 (dấu cách, dấu trừ, p), nhưng nếu mã cũng hoạt động trên dòng lệnh nơi bạn nhận được -e'miễn phí, tôi sẽ ghi điểm +1vì nó có thể được gói cùng vớie
TonMedel

Được rồi, tôi chỉ không rõ ràng về cách chính xác điểm số dòng lệnh. Tôi đã không nhận ra bạn nhận được 'miễn phí. Cám ơn giải thích rõ ràng.
Riley

3

Haskell, 84 83 byte

(a:b:c)#z|i<-1+length(fst$span(/=b)z),h<- \f->f i(b:c)#f i z=h take++a:h drop
a#_=a

2

JavaScript (ES6), 100 byte

f=(s,t,l=t.search(s[1]))=>s[1]?f(s.slice(1,++l+1),t.slice(0,l))+s[0]+f(s.slice(l+1),t.slice(l)):s[0]

I / O nằm trong chuỗi các ký tự "an toàn" (ví dụ: chữ cái hoặc chữ số). Cách tiếp cận khác, cũng 100 byte:

f=(s,t,a=0,b=0,c=s.length-1,l=t.search(s[a+1])-b)=>c?f(s,t,a+1,b,l)+s[a]+f(s,t,l+2+a,l+1,c-l-2):s[a]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.