ความคล้ายของต้นไม้

o62_mar_c2_treesim

ในข้อนี้เราได้ full binary tree มา 2 ต้น ขอเรียกว่า T1T_1 และ T2T_2

สังเกตว่าการเปรียบเทียบคู่เซตของใบไม้ระหว่างทั้งสองต้นสามารถเปรียบเทียบเพียงเซตใดเซตเดียวก็เพียงพอแล้ว ดังนั้นงานของเรามีแค่เช็คว่า มี (u,v)(u, v) กี่คู่ที่เซตใบไม้ที่อยู่ใน subtree ของ uu ใน T1T_1 เท่ากับเซตใบไม้ที่อยู่ใน subtree ของ vv ใน T2T_2

จากนั้นเราจะทำการเปลี่ยนตัวเลขของใบในต้นไม้ดังนี้

ก่อนอื่นเราจะทำ pre-order traversal ลงไปใน T1T_1 จากนั้นเราจะเปลี่ยนตัวเลขของใบไม้ใน T1T_1 เป็นลำดับที่มันโดน visit ใน pre-order traversal นั้น ๆ แล้วเปลี่ยนตัวเลขของใบไม้ใน T2T_2 ให้สอดคล้องกัน

หลังจากทำเช่นนี้แล้วสังเกตว่า เซตของใบไม้ที่อยู่ใน subtree ใด ๆ ใน T1T_1 จะเป็น complete interval [a,b][a, b] เสมอ ดังนั้นเราจึงสามารถแทนเซต ๆ หนึ่งของ T1T_1 ได้ด้วยเพียงแค่คู่อันดับ (a,b)(a, b) ดังนั้นเราจะมีคู่อันดับ (a,b)(a, b) จำนวน N2N-2 คู่สำหรับ T1T_1

จากนั้นให้คำนวณค่า 3 ค่าสำหรับทุก ๆ จุดยอดที่ไม่ใช่ใบไม้บน T2T_2

  • min(u)min(u) โหนดใบไม้ที่มีหมายเลขน้อยที่สุดใน subtree ของ uu
  • max(u)max(u) โหนดใบไม้ที่มีหมายเลขมากที่สุดใน subtree ของ uu
  • cnt(u)cnt(u) จำนวนใบไม้ใน subtree ของ uu

จะเห็นได้ว่าให้เราทิ้งจุดยอด uu ที่ max(u)min(u)+1cnt(u)max(u)-min(u)+1 \neq cnt(u) ไปได้เลย เพราะนั่นหมายความว่าเซตของจุดยอดใน subtree นี้ไม่ได้เป็น complete interval

สำหรับจุดยอดที่ max(u)min(u)+1=cnt(u)max(u)-min(u)+1 = cnt(u) นั้น เราก็เพียงแค่ไปเช็คว่ามีคู่อันดับ (min(u),max(u))(min(u), max(u)) อยู่ในเซตคู่อันดับที่เราเคยหามาจาก T1T_1 หรือไม่ โดยอาจทำได้หลายวิธี เช่น sort และ binary search หรือใช้ binary search tree

ดังนั้นเราจะได้อัลกอริธึมที่สามารถแก้ปัญหานี้ได้ภายในเวลา O(nlogn)\mathcal{O}(n \log n)