สั่งซื้อล่วงหน้า + โพสต์ตามสั่งในการสั่งซื้อ


11

งาน

รับการสำรวจเส้นทางการสั่งซื้อล่วงหน้าและการสั่งซื้อสินค้าของต้นไม้ไบนารีเต็มรูปแบบให้ส่งคืนการสำรวจเส้นทางตามลำดับ

การสำรวจเส้นทางจะถูกแสดงเป็นสองรายการซึ่งทั้งคู่ประกอบด้วยnจำนวนเต็มบวกที่แตกต่างกันโดยแต่ละโหนดจะระบุเฉพาะ โปรแกรมของคุณอาจใช้รายการเหล่านี้และออกผลลัพธ์การส่งผ่านตามลำดับโดยใช้รูปแบบ I / O ที่สมเหตุสมผล

คุณอาจถือว่าข้อมูลที่ป้อนนั้นถูกต้อง (นั่นคือรายการจริง ๆ แล้วเป็นตัวแทนการสำรวจเส้นทางของต้นไม้บางต้น)

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

คำนิยาม

ต้นไม้ไบนารีเต็มรูปแบบเป็นโครงสร้างที่ จำกัด ของโหนดแทนนี่โดยจำนวนเต็มบวกที่ไม่ซ้ำกัน

ต้นไม้ไบนารีเต็มรูปแบบคือใบไม้ซึ่งประกอบด้วยโหนดเดียว:

                                      1

หรือสาขาที่ประกอบด้วยหนึ่งโหนดที่มีสองsubtrees (เรียกว่าsubtrees ซ้ายและขวา ) ซึ่งแต่ละอันก็เป็นต้นไม้ไบนารีเต็มรูปแบบ:

                                      1
                                    /   \
                                  …       …

นี่คือตัวอย่างเต็มของต้นไม้ไบนารีเต็ม:

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

การสำรวจเส้นทางการสั่งซื้อล่วงหน้าของต้นไม้ไบนารีเต็มถูกกำหนดแบบเรียกซ้ำดังนี้:

  • สำรวจเส้นทางการสั่งซื้อล่วงหน้าของใบมีโหนดnรายการ [ n ]
  • การสำรวจเส้นทางล่วงหน้าของสาขาที่มีโหนดnและต้นไม้ย่อย(L, R)คือรายการ [ n ] +  preorder ( L ) +  preorder ( R ) โดยที่ + เป็นตัวดำเนินการเรียงลำดับรายการ

สำหรับต้นไม้ข้างต้นว่า[6, 3, 1, 8, 2, 9, 4, 5, 7]


การสำรวจเส้นทางหลังการสั่งซื้อของต้นไม้ไบนารีเต็มถูกกำหนดแบบเรียกซ้ำดังนี้:

  • สำรวจเส้นทางการโพสต์คำสั่งของใบมีโหนดnรายการ [ n ]
  • Postorder สำรวจเส้นทางของสาขาที่มีโหนดnและ sub-ต้นไม้(L, R)เป็นรายการPostorder ( L ) +  Postorder ( R ) + [ n ]

สำหรับต้นไม้ข้างต้นว่า[1, 2, 9, 8, 3, 5, 7, 4, 6]


การสำรวจเส้นทางตามลำดับของต้นไม้ไบนารีเต็มถูกกำหนดแบบวนซ้ำดังนี้:

  • สำรวจเส้นทางในคำสั่งของใบมีโหนดnรายการ [ n ]
  • การสำรวจเส้นทางตามลำดับของสาขาที่มีโหนดnและต้นไม้ย่อย(L, R)คือลิสต์inorder ( L ) + [ n ] +  inorder ( R )

สำหรับต้นไม้ข้างต้นว่า[1, 3, 2, 8, 9, 6, 5, 4, 7]


สรุป: ให้คู่ของรายการ[6, 3, 1, 8, 2, 9, 4, 5, 7] (ก่อน) และ[1, 2, 9, 8, 3, 5, 7, 4, 6] (โพสต์) เป็น input โปรแกรมของคุณควรส่งออก[1, 3, 2, 8, 9, 6, 5, 4, 7]

กรณีทดสอบ

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]

เนื่องจากอินพุตมีการรับประกันว่าจะมีรูปร่างที่เฉพาะเจาะจง (ต้นไม้ไบนารีสมบูรณ์) คุณไม่จำเป็นต้องใช้ทั้งสองอินพุตจริงหรือไม่?
feersum

ต้นไม้ไบนารีเต็มแต่ไม่สมบูรณ์ดังนั้นต้นไม้n-องค์ประกอบสามารถมีรูปร่างได้หลายรูปแบบและโดยทั่วไปคุณต้องการทั้งสองอย่าง
ลินน์

ฉันขอแสดงโหนดเป็นตัวอักษรตัวเดียวที่ให้คำสั่งสำหรับสตริง เช่นตัวอย่างที่สองจะกลายเป็น: "CDE" and "DEC" give "DCE"? (แม้จะใช้ตัวอักษร unicode ถ้าฉันต้องการโหนดจำนวนมาก)
Ton Hospel

@TonHospel ฉันจะโอเคกับที่ - เนื้อหาทั้งหมดที่คุณกำลังทำคือการยืดความหมายของการที่รายการของจำนวนเต็มเล็ก ๆ น้อย ๆ เพราะ"CDE"ไม่ได้แตกต่างกันมากจาก[67, 68, 69]:)
ลินน์

คำตอบ:


2

Perl, 69 66 62 56 53 ไบต์

รวม +1 สำหรับ -p

ใช้เวลา postorder ตามด้วย preorder เป็นหนึ่งบรรทัดคั่นด้วยช่องว่างบน STDIN (สังเกตคำสั่งของ pre และ post) โหนดจะแสดงเป็นตัวอักษรที่ไม่ซ้ำกัน (อักขระใด ๆ ที่ไม่ใช่ช่องว่างหรือขึ้นบรรทัดใหม่ก็โอเค)

inpost.pl <<< "98231 12983"

inpost.pl:

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

การใช้รูปแบบตัวเลขดั้งเดิมล้วนต้องใช้ความระมัดระวังมากขึ้นในการระบุหมายเลขเดียวและมาที่ 73 ไบต์

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

ใช้เป็น

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

-pเพิ่มในตอนท้ายเพื่อให้คุณไม่จำเป็นต้องสุดท้าย; ->;s;.* ;;s;.* ;
Riley

@ หรูหราฉันรู้ นั่นเป็นสาเหตุที่ฉันมี;ตอนจบ แต่จริง ๆ แล้ว -p เพิ่ม\n;ไปยังจุดสิ้นสุดใน-eโปรแกรม ในแฟ้มจะเพิ่มเพียงถ้าหากไฟล์ไม่สิ้นสุดในวันที่; \nตั้งแต่ผมต้องการที่จะเรียกร้อง-pเป็น 1 และ 3 -eไม่ได้ตอบสนองความต้องการของโปรแกรมการทำงานจากบรรทัดคำสั่งเพื่อให้มี และฉันไม่ต้องการบรรทัดใหม่ที่น่า
เกรงขาม

หากคุณใช้มันใน commandline คุณไม่ต้องการ'มันเหรอ? หากคุณเรียกใช้ในแบบที่คุณมี (เรียกไฟล์ด้วย<<<) คุณสามารถออกจากไฟล์สุดท้าย;ได้
Riley

@Riley ขึ้นอยู่กับการตีความของวิธีการให้คะแนนสำหรับ perl ฉันมักจะส่งรหัสของฉันเป็นไฟล์เนื่องจากฉันคิดว่านั่นเป็นเพียงชั่วคราว แต่ถ้าคุณดูที่การส่งของฉันคุณจะเห็นว่าถ้ารหัสต้องอยู่ในไฟล์ (เพราะเช่นมันมี'หรือใช้do$0ฯลฯ ) ฉันมักจะคะแนน-pเป็น +3 (เว้นวรรค, ลบ, p) แต่ถ้ารหัสจะทำงาน บน commandline ที่คุณได้รับ-eและ'ฟรีฉันทำคะแนนได้+1เพราะมันสามารถรวมกับe
Ton Hospel

โอเคฉันไม่ชัดเจนเลยว่าคะแนนการส่งของบรรทัดคำสั่งนั้นตรงไหน ฉันไม่ได้ตระหนักว่าคุณได้รับ'ฟรี ขอบคุณที่ล้างข้อมูล
Riley


2

JavaScript (ES6), 100 ไบต์

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 เป็นสตริงของอักขระ "ปลอดภัย" (เช่นตัวอักษรหรือตัวเลข) ทางเลือกวิธี 100 ไบต์ด้วย:

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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.