ในสิ่งต่าง ๆ เช่นนี้มักจะคิดย้อนกลับง่ายกว่าดังนั้นก่อนอื่นให้พิจารณาสิ่งที่คุณต้องการ จากคำอธิบายของคุณมาแสดงรายการพวกเขา:
- recursion
- ความถูกต้อง
- จำนวนโหนดที่สมบูรณ์
ตกลงนั่นเป็นรายการที่ค่อนข้างสั้นซึ่งควรจัดการได้ เริ่มกันด้วยวิธีที่ว่างเปล่าแล้วฉันจะเพิ่มคำอธิบายของสิ่งที่ควรจะเกิดขึ้น
valid_bst () {
}
ตอนนี้มีผลบังคับใช้ คุณตรวจสอบความถูกต้องได้อย่างไร ในการแชทคุณกล่าวว่าต้นไม้มีผลบังคับใช้ "ถ้า ... เด็กที่เหลือทั้งหมดน้อยกว่าผู้ปกครองและเด็กที่ถูกต้องมากกว่าผู้ปกครอง" ฉันแน่ใจว่าคุณหมายถึงการให้ความเท่าเทียมกันเช่นกัน t.left.value <= t.value <= t.right.value
ที่จะเป็น
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
แต่ถ้าเด็กคนใดคนหนึ่งหายไป จากสิ่งที่คุณพูดฉันเชื่อว่าคุณรู้ว่าโหนดนั้นยังคงใช้ได้หากไม่มี (หรือทั้งสองอย่าง) ขาดหายไป ลองเพิ่มสิ่งนี้ปรับโครงสร้างเล็กน้อย:
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
}
ตกลงตอนนี้เรารู้ว่าโหนดนี้ถูกต้อง เราจะตรวจสอบว่าต้นไม้ทั้งหมดถูกต้องได้อย่างไร มันไม่ได้อยู่ในอาร์เรย์ดังนั้นเราอาจจะไม่สามารถ / ไม่ต้องการวนซ้ำมันเป็นเส้นตรง การมอบหมายของคุณให้คำตอบ: การเรียกซ้ำ แต่เราจะสะสมคำตอบโดยใช้การเรียกซ้ำได้อย่างไร เราสามารถเข้าถึงข้อมูลสามส่วนไม่ว่าจะเป็นโหนดนี้ถูกต้องและผลของการโทรถามว่าโหนดซ้ายและขวานั้นถูกต้องหรือไม่ เห็นได้ชัดว่าต้นไม้จะใช้ได้ก็ต่อเมื่อทั้งสามนั้นเป็นจริง
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
Is the left child valid?
Is the right child valid?
This tree is only valid if this node and both its children are.
}
หากคุณให้ความสนใจนั่นคือสิ่งที่บอกเราถึงสิ่งที่ฟังก์ชั่นของเราต้องการที่จะกลับมา
ตอนนี้เราจะรวมการนับได้อย่างไร คุณพูดสิ่งที่นับ ("โหนดหลักที่มีโหนดลูกทั้งซ้ายและขวา") และไม่ควรแปลเป็นรหัสจริงได้ยาก ตรวจสอบว่าเงื่อนไขนั้นเป็นที่น่าพอใจและเพิ่มเคาน์เตอร์อย่างเหมาะสม เพียงจำไว้ว่าสิ่งนี้จะต้องอยู่ที่ไหนสักแห่งที่จะไปถึงทุกครั้งที่เป็นจริง
และแน่นอนฉันได้ละรายละเอียดบางอย่างเช่นเงื่อนไขการหยุดซ้ำและการตรวจสอบค่าว่าง
<
ถูกกำหนดบนโหนดอย่างไร