การรวมกันของลำดับก่อนหลังโพสต์และลำดับที่ไม่ซ้ำกัน?


28

เรารู้ว่าโพสต์ - สั่ง

post L(x)     => [x]
post N(x,l,r) => (post l) ++ (post r) ++ [x]

และสั่งซื้อล่วงหน้า

pre L(x)     => [x]
pre N(x,l,r) => [x] ++ (pre l) ++ (pre r)

และการแวะผ่านตามลำดับ sequentialisation

in L(x)     => [x]
in N(x,l,r) => (in l) ++ [x] ++ (in r)

เราสามารถเห็นได้อย่างง่ายดายว่าไม่ได้อธิบายต้นไม้ที่ให้มาโดยเฉพาะแม้ว่าเราจะถือว่าคีย์ / ป้ายกำกับที่ต่างกัน

ชุดค่าผสมใดในสามที่สามารถใช้ในการสิ้นสุดนั้นและไม่สามารถทำได้

คำตอบที่เป็นบวกควรมีอัลกอริธึมที่มีประสิทธิภาพในการสร้างต้นไม้ใหม่และพิสูจน์ (ความคิด) ว่าทำไมจึงถูกต้อง คำตอบเชิงลบควรให้ตัวอย่างเคาน์เตอร์เช่นต้นไม้ต่าง ๆ ที่มีการแสดงเดียวกัน

คำตอบ:


16

ก่อนอื่นฉันจะสมมติว่าองค์ประกอบทั้งหมดนั้นแตกต่างกัน ปริมาณของ sequentialisations [3,3,3,3,3]ไม่มีจะไปบอกคุณรูปร่างของต้นไม้ที่มีองค์ประกอบ เป็นไปได้ที่จะสร้างต้นไม้ขึ้นใหม่ด้วยองค์ประกอบที่ซ้ำกันแน่นอน ฉันไม่รู้ว่ามีเงื่อนไขเพียงพอที่ดีอยู่

ดำเนินการต่อกับผลลัพธ์เชิงลบคุณไม่สามารถสร้างแผนภูมิต้นไม้ไบนารีได้อย่างสมบูรณ์จากลำดับก่อนหลังและลำดับโพสต์ตามลำดับเพียงอย่างเดียว [1,2]pre [2,1]-order post-order ต้อง1อยู่ที่ root แต่2สามารถเป็นได้ทั้งลูกซ้ายหรือลูกขวา หากคุณไม่สนใจความกำกวมนี้คุณสามารถสร้างต้นไม้ใหม่ด้วยอัลกอริทึมต่อไปนี้:

  • ให้เป็นเส้นทางการสั่งซื้อล่วงหน้าและเป็นเส้นทางการส่งคำสั่งซื้อล่วงหน้า เราต้องมีและนี่คือรากของต้นไม้[x1,,xn][yn,,y1]x1=y1
  • x2เป็นลูกที่อยู่ทางซ้ายสุดของรูทและเป็นลูกที่อยู่ขวาสุด หากโหนดรูทจะไม่พร้อมกัน ชดเชยมากกว่าและเพื่อสร้างทรีย่อยy2x2=y2[x2,,xn][yn,,y2]
  • มิฉะนั้นให้และเป็นดัชนีดังกล่าวว่าและx_j คือการสำรวจเส้นทางล่วงหน้าของทรีย่อยทางซ้ายทรีย่อยที่ถูกต้องและคล้ายกันสำหรับทราฟฟอร์โพสต์ลำดับ ทรีย่อยซ้ายมีองค์ประกอบและทรีย่อยทางขวามีองค์ประกอบ ชดเชยหนึ่งครั้งสำหรับแต่ละทรีย่อย โดยวิธีการนี้วิธีการทั่วไปกับต้นไม้ด้วยการแยกสาขาโดยพลการ ด้วยการแยกสาขาโดยพลการค้นหาขอบเขตของทรีย่อยซ้ายและตัดองค์ประกอบออกจากรายการทั้งสองจากนั้นทำซ้ำเพื่อตัดทรีย่อยทรีที่สองออกจากด้านซ้ายและอื่น ๆijx2=yiy2=xj[x2,,xj1][xj,,xn]j2=ni+1i2=nj+1
    j2

ตามที่ระบุเวลาทำงานคือกับกรณีที่เลวร้ายที่สุด (ในกรณีที่มีลูกสองคนเราจะค้นหารายการแต่ละรายการ) คุณสามารถเปลี่ยนให้เป็นหากคุณประมวลผลรายการล่วงหน้าเพื่อสร้างโครงสร้างแผนที่ จำกัด จากค่าองค์ประกอบไปยังตำแหน่งในรายการอินพุต . นอกจากนี้ยังใช้อาร์เรย์หรือแผนที่ จำกัด เพื่อเปลี่ยนจากดัชนีเป็นค่า ติดกับดัชนีทั่วโลกดังนั้นการโทรซ้ำจะได้รับแผนที่ทั้งหมดและใช้ช่วงเป็นอาร์กิวเมนต์ที่จะรู้ว่าจะทำอย่างไรO(n2)Θ(n2)O(nlg(n))nlg(n)

ด้วยการแวะผ่านการสั่งซื้อล่วงหน้าและการสำรวจเส้นทางภายในคุณสามารถสร้างต้นไม้ขึ้นใหม่ดังนี้:[x1,,xn][z1,,zn]

  • รากเป็นหัวหน้าของการสั่งซื้อล่วงหน้าข้ามผ่านx_1x1
  • ให้เป็นดัชนีดังกล่าวที่x_1 จากนั้นเป็น traversal ตามลำดับของลูกซ้ายและเป็น traversal ตามลำดับของลูกขวา ไปตามจำนวนขององค์ประกอบเป็นการสำรวจเส้นทางล่วงหน้าของลูกซ้ายและของลูกที่ถูกต้อง เงินคืนเพื่อสร้างทรีย่อยทางซ้ายและขวาkzk=x1[z1,,zk1][zk+1,,zn][x2,,xk][xk+1,,xn]

อีกครั้งอัลกอริทึมนี้คือตามที่ระบุไว้และสามารถดำเนินการในหากรายการถูกประมวลผลล่วงหน้าลงในแผนที่ จำกัด จากค่าไปยังตำแหน่งO(n2)O(nlg(n))

การโพสต์คำสั่งซื้อและการสั่งซื้อเป็นไปตามสัดส่วน


มีการพิมพ์ผิดที่นี่หรือไม่: "[1,2] preorder, [1,2] ลำดับหลังต้องมี 1 ที่ root แต่ 2 สามารถเป็นลูกซ้ายหรือลูกขวา" ลำดับการโพสต์ของ ต้นไม้จะเป็น [2,1] ไม่ใช่ [1,2] ไม่ว่า 2 จะเป็นลูกซ้ายหรือขวา นอกจากนี้คุณหมายถึงถ้าได้รับทั้ง preorder และ postorder เราไม่สามารถสร้างต้นไม้ขึ้นมาใหม่หรือคุณหมายความว่าถ้าเราได้รับเพียงหนึ่งในนั้นเราจะไม่สามารถสร้างต้นไม้ได้หรือไม่
CEGRD

@CEGRD จริง ๆ แล้ว postorder นั้นเป็นตัวพิมพ์ผิด ตัวอย่างแสดงให้เห็นว่าคุณไม่สามารถสร้างต้นไม้ใหม่ได้อย่างสมบูรณ์ในกรณีนี้คุณไม่สามารถรู้ได้ว่า2เป็นลูกซ้ายหรือลูกขวา สิ่งนี้สอดคล้องกับกรณี“ ทรีย่อยเดียว” ของอัลกอริทึมการสร้างใหม่
Gilles 'หยุดชั่วร้าย'

การเปลี่ยนแปลงนี้จะเกิดขึ้นได้อย่างไรหากเรารู้ว่ามันเป็นแผนผังการค้นหาแบบไบนารี สำหรับกรณีง่าย ๆ ในตัวอย่างของคุณ ([1,2] preorder, [2,1] ลำดับหลังคำสั่ง) เราจะสามารถระบุได้ว่ารูทคือ 1 และ 2 นั้นเป็นลูกที่ถูกต้อง (เพราะ 2 มากกว่า 1) ... ใช่มั้ย
fersarr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.