ความแตกต่างระหว่างต้นไม้ไบนารีและต้นไม้ค้นหาแบบทวิภาค


322

ทุกคนสามารถอธิบายความแตกต่างระหว่างแผนภูมิต้นไม้และต้นไม้ค้นหาแบบไบนารี ด้วยตัวอย่างได้หรือไม่?

คำตอบ:


566

ต้นไม้ไบนารี: ต้นไม้ที่แต่ละโหนดมีมากถึงสองใบ

  1
 / \
2   3

ต้นไม้ค้นหาแบบทวิภาค: ใช้สำหรับการค้นหา ต้นไม้ไบนารีที่ลูกซ้ายมีเพียงโหนดที่มีค่าน้อยกว่าโหนดหลักและตำแหน่งที่เด็ก ๆ ขวาเท่านั้นมีโหนดที่มีค่ามากกว่าหรือเท่ากับผู้ปกครอง

  2
 / \
1   3

14
@pete: มันเป็นสิ่งที่มีแนวคิดคุณไม่จำเป็นต้องสร้างมันขึ้นมาจริงๆ อย่างไรก็ตามมีต้นไม้ไบนารีที่ไม่ใช่การค้นหาจำนวนมากที่มีความพิเศษในทางอื่นเช่นไบนารีกอง
user541686

19
@ pir birary trees ไม่จำเป็นต้องมีข้อมูลที่เปรียบเทียบได้หลาย ๆ ต้น (ไม่ใช่การค้นหา) ต้นไม้ binary ที่ใช้สำหรับการแยกการแสดงออกเกี่ยวกับพีชคณิต, ต้นไม้ไบนารีเป็นที่สมบูรณ์แบบ t เขียนเครื่องหมายสัญกรณ์ infix โดยวางตัวดำเนินการเป็นโหนด (s) และค่าตัวเลข เหมือนใบไม้
JBoy

2
@JBoy: พวกเขาจะไม่เป็นต้นไม้ไบนารีในกรณีนั้น (เช่นผู้ดำเนินการที่ไม่มีผู้ติดตามจะไม่มีลูกสองคน) ฉันไม่สามารถนึกถึงกรณีการใช้งานจริงสำหรับต้นไม้ไบนารีที่ไม่มีข้อ จำกัด นั่นคือเหตุผลที่ฉันแสดงความคิดเห็นนั้น
user541686

2
ยอดเยี่ยมและเรียบง่าย +1 สำหรับตัวอย่างด้านภาพ :)
Andrei Konstantinov

@Mehrdad ต้นไม้ไบนารีมีหนึ่งหรือสองลูกต่อโหนด ต้นไม้ที่แสดงออกเป็นตัวอย่างที่สมบูรณ์แบบ แผนภูมิการค้นหาแบบไบนารี่ยังมีลูกหนึ่งหรือสองลูกต่อโหนดเว้นแต่ว่ามันจะเต็มซึ่งสามารถเกิดขึ้นได้กับองค์ประกอบจำนวนหนึ่งเท่านั้น
มาร์ควิสแห่ง Lorne

56

Binary Treeเป็นรูปแบบเฉพาะของต้นไม้ที่มีลูกสองคน (ลูกซ้ายและลูกขวา) มันเป็นเพียงการแสดงข้อมูลในโครงสร้างต้นไม้

Binary Search Tree (BST)เป็น Binary Tree ชนิดพิเศษที่ตามเงื่อนไขต่อไปนี้:

  1. โหนดลูกด้านซ้ายมีขนาดเล็กกว่าโหนดแม่
  2. โหนดลูกที่ถูกต้องมากกว่าโหนดแม่ของมัน

23
เงื่อนไขเหล่านี้ไม่เพียงพอ ทรีย่อยด้านซ้ายทั้งหมดต้องไม่มีคีย์น้อยกว่าของพาเรนต์เท่านั้นและทรีย่อยด้านขวาทั้งหมดจะต้องมีโหนดที่ใหญ่กว่า
มาร์ควิสแห่ง Lorne

1
@EJP คุณสามารถอธิบายความคิดเห็นของคุณได้ไหม? ทรีย่อยทั้งหมดแปลว่าอะไร? คุณหมายถึงว่าค่าทั้งหมดของต้นไม้ย่อยควรน้อยกว่าที่จะรูตทางด้านซ้ายหรือไม่? และค่าทั้งหมดควรมากกว่าค่ารูตทางด้านขวาหรือไม่
Asif Mushtaq

ตามลิงค์ที่สองอ่านหัวข้อ "การยืนยัน" และจะมีความชัดเจน
Rob

38

ต้นไม้ไบนารีทำจากโหนดที่แต่ละโหนดมีตัวชี้ "ซ้าย" ตัวชี้ "ขวา" และองค์ประกอบข้อมูล ตัวชี้ "root" ชี้ไปที่โหนดบนสุดในทรี พอยน์เตอร์ซ้ายและขวาชี้ซ้ำไปที่ "ทรีย่อย" ที่เล็กลงทั้งสองข้าง พอยน์เตอร์พอยน์เตอร์แสดงถึงต้นไม้ไบนารีที่ไม่มีองค์ประกอบ - ต้นไม้ว่าง นิยามแบบเรียกซ้ำอย่างเป็นทางการคือ: ต้นไม้ไบนารีเป็นทั้งว่างเปล่า (แสดงโดยตัวชี้โมฆะ) หรือทำจากโหนดเดียวที่ตัวชี้ซ้ายและขวา (คำนิยามซ้ำไปข้างหน้า) แต่ละจุดไปยังต้นไม้ไบนารี

ต้นไม้ค้นหาแบบไบนารี่ (BST) หรือ "ต้นไม้ไบนารีที่สั่งซื้อ" เป็นประเภทของต้นไม้แบบทวิภาคที่มีการจัดเรียงโหนดตามลำดับ: สำหรับแต่ละโหนดองค์ประกอบทั้งหมดในทรีย่อยทางซ้ายของมันจะน้อยกว่าโหนด (<) และองค์ประกอบทั้งหมด ในทรีย่อยด้านขวามีค่ามากกว่าโหนด (>)

    5
   / \
  3   6 
 / \   \
1   4   9    

ทรีที่แสดงด้านบนเป็นแผนผังการค้นหาแบบไบนารี่ - โหนด "รูท" คือ 5 และโหนดทรีย่อยทางซ้าย (1, 3, 4) คือ <5 และโหนดทรีย่อยทางขวา (6, 9) คือ> 5 ทรีย่อยแต่ละทรีจะต้องปฏิบัติตามข้อ จำกัด ทรีการค้นหาแบบไบนารีด้วย: ในทรีย่อย (1, 3, 4), 3 คือรูท, 1 <3 และ 4> 3

ระวังคำที่ถูกต้องในปัญหา - "แผนภูมิการค้นหาแบบไบนารี" แตกต่างจาก "ต้นไม้แบบไบนารี"


@GabrielStaples เพิ่มโครงสร้างต้นไม้
Gaurav Borole

14

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

boolean b = new Sample().isBinarySearchTree(n1, Integer.MIN_VALUE, Integer.MAX_VALUE);
.......
.......
.......
public boolean isBinarySearchTree(TreeNode node, int min, int max)
{

    if(node == null)
    {
        return true;
    }

    boolean left = isBinarySearchTree(node.getLeft(), min, node.getValue());
    boolean right = isBinarySearchTree(node.getRight(), node.getValue(), max);

    return left && right && (node.getValue()<max) && (node.getValue()>=min);

}

หวังว่ามันจะช่วยคุณ ขออภัยถ้าฉันเปลี่ยนจากหัวข้อเพราะฉันรู้สึกว่ามันควรค่าแก่การกล่าวถึงที่นี่


1
ทรีย่อยด้านซ้ายหรือด้านขวาสามารถว่างได้ รหัสของคุณจัดการกรณีนั้นไม่ถูกต้อง
มาร์ควิสแห่ง Lorne

11

ต้นไม้ไบนารีหมายถึงโครงสร้างข้อมูลที่ถูกสร้างขึ้นจากโหนดที่สามารถเพียง แต่มีเด็กสองคนอ้างอิง

ในทางกลับกัน Binary Search Tree ( BST ) เป็นรูปแบบพิเศษของโครงสร้างข้อมูลแบบไบนารีซึ่งแต่ละโหนดมีค่าที่เปรียบเทียบกันได้และเด็กที่มีค่าน้อยกว่าจะแนบกับเด็กที่มีมูลค่าทางซ้ายและใหญ่กว่าที่ติดอยู่ทางขวา

ดังนั้นBSTทั้งหมดคือBinary Treeแต่Binary Treeบางอย่างอาจเป็นBSTเท่านั้น แจ้งให้ทราบว่าBSTเป็นส่วนหนึ่งของต้นไม้ไบนารี

ดังนั้นต้นไม้ไบนารีเป็นมากกว่าทั่วไปข้อมูลโครงสร้างกว่าBinary ค้นหาต้นไม้ และยังให้คุณได้แจ้งให้ทราบว่าBinary ค้นหาต้นไม้เป็นเรียงต้นไม้ในขณะที่ไม่มีชุดดังกล่าวของกฎระเบียบสำหรับการทั่วไปต้นไม้ไบนารี

ต้นไม้ไบนารี

Binary Treeซึ่งเป็นไม่BST ;

         5
       /   \
      /     \
     9       2
    / \     / \
  15   17  19  21

ต้นไม้ค้นหาแบบทวิภาค (ต้นไม้เรียง)

ค้นหาแบบไบนารีต้นไม้ซึ่งยังเป็นต้นไม้ไบนารี ;

         50
       /    \
      /      \
     25      75
    /  \    /  \
  20    30 70   80

คุณสมบัติโหนดค้นหาต้นไม้แบบไบนารี

นอกจากนี้ยังแจ้งว่าสำหรับโหนดแม่ใด ๆในBST ;

  • โหนดด้านซ้ายทั้งหมดมีค่าน้อยกว่าค่าของโหนดพาเรนต์ ในตัวอย่างด้านบนโหนดที่มีค่า {20, 25, 30} ซึ่งอยู่ทางด้านซ้าย ( ลูกหลานซ้าย ) ของ 50 มีขนาดเล็กกว่า 50

  • โหนดด้านขวาทั้งหมดมีค่ามากกว่าค่าของโหนดพาเรนต์ ในตัวอย่างด้านบนโหนดที่มีค่า {70, 75, 80} ซึ่งทั้งหมดตั้งอยู่ทางด้านขวา ( ลูกหลานขวา ) ที่ 50 มีค่ามากกว่า 50

ไม่มีกฎดังกล่าวสำหรับโหนดต้นไม้ไบนารี กฎเฉพาะสำหรับต้นไม้ไบนารีโหนดจะมีสองเด็กจึงตนเองอธิบายตัวเองว่าทำไมเรียกว่าไบนารี


เราสามารถใช้ Simple Binary Tree ได้หรือไม่ มีการนำไปใช้ใดบ้าง และต้นไม้นี้มีประโยชน์อย่างไร?
Asif Mushtaq

@UnKnown คุณสามารถใช้ Binary Search Tree เพื่อจัดเรียงและค้นหา คุณสามารถค้นหาการใช้ Binary Search Tree ได้ที่นี่: github.com/bzdgn/data-structures-in-java/blob/master/src/ …
Levent Divilioglu

ฉันรู้เรื่องนี้ แต่มี Simple Tree หรือ Simple Binary Tree หรือเปล่า? หรือการติดตั้ง Simple Binary Tree ใด ๆ
Asif Mushtaq

ไม่มีจุดที่จะใช้สิ่งนั้น แต่คุณสามารถเพิ่มอินสแตนซ์โหนดโดยพลการให้กับรูทและส่วนย่อยได้
Levent Divilioglu

10

แผนผังการค้นหาแบบไบนารี่เป็นต้นไม้ไบนารีชนิดพิเศษซึ่งแสดงคุณสมบัติต่อไปนี้: สำหรับโหนดใด ๆ ค่าของโหนดที่สืบทอดทุกค่าในทรีย่อยทางซ้ายของ n จะน้อยกว่าค่าของ n และค่าของโหนดลำดับที่อยู่ด้านขวาทั้งหมดคือ มากกว่าค่าของ n


8

ต้นไม้ไบนารี

ต้นไม้ไบนารีสามารถเป็นอะไรก็ได้ที่มีลูก 2 คนและผู้ปกครอง 1 คน สามารถนำไปใช้เป็นรายการหรืออาร์เรย์ที่เชื่อมโยงหรือกับ API ที่กำหนดเองของคุณ เมื่อคุณเริ่มที่จะเพิ่มกฎที่เฉพาะเจาะจงมากยิ่งขึ้นในมันจะกลายเป็นมากขึ้นต้นไม้เฉพาะ การนำไปปฏิบัติที่รู้จักกันมากที่สุดคือการเพิ่มโหนดขนาดเล็กด้านซ้ายและใหญ่กว่าด้านขวา

ยกตัวอย่างเช่นต้นไม้ไบนารีที่มีข้อความที่มีขนาดและความสูง 9 3 กับโหนดรากที่มีค่า 2. ต้นไม้ที่ไม่สมดุลและไม่ได้เรียง https://en.wikipedia.org/wiki/Binary_tree

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างเช่นในต้นไม้ทางด้านซ้าย A มีลูก 6 คน {B, C, D, E, F, G} มันสามารถแปลงเป็นต้นไม้ไบนารีทางด้านขวา

ป้อนคำอธิบายรูปภาพที่นี่

ค้นหาแบบทวิภาค

การค้นหาแบบไบนารี่เป็นเทคนิค / อัลกอริทึมที่ใช้ในการค้นหารายการเฉพาะบนโหนดเชน การค้นหาแบบไบนารีทำงานบนอาร์เรย์ที่เรียงลำดับแล้ว

การค้นหาแบบไบนารีเปรียบเทียบค่าเป้าหมายกับองค์ประกอบกลางของอาร์เรย์ หากพวกเขาไม่เท่ากันครึ่งที่เป้าหมายไม่สามารถกำจัดได้จะถูกตัดออกและการค้นหาจะดำเนินต่อไปในครึ่งที่เหลือจนกว่าจะประสบความสำเร็จหรือครึ่งที่เหลือนั้นว่างเปล่า https://en.wikipedia.org/wiki/Binary_search_algorithm

ป้อนคำอธิบายรูปภาพที่นี่

ต้นไม้เป็นตัวแทนค้นหาแบบทวิภาค อาร์เรย์ที่ค้นหาที่นี่คือ [20, 30, 40, 50, 90, 100] และค่าเป้าหมายคือ 40

ป้อนคำอธิบายรูปภาพที่นี่

แผนผังการค้นหาแบบทวิภาค

นี่เป็นหนึ่งในการนำไปใช้ของต้นไม้ไบนารี นี้เป็นพิเศษสำหรับการค้นหา

โครงสร้างต้นไม้ค้นหาไบนารีและ B ต้นไม้ข้อมูลที่อยู่บนพื้นฐานของการค้นหาแบบไบนารี

ต้นไม้การค้นหาแบบไบนารี่ (BST) บางครั้งเรียกว่าการเรียงลำดับหรือการจัดเรียงต้นไม้แบบทวิตเป็นชนิดของคอนเทนเนอร์เฉพาะ : โครงสร้างข้อมูลที่เก็บ "รายการ" (เช่นตัวเลขชื่อ ฯลฯ ) ในหน่วยความจำ https://en.wikipedia.org/wiki/Binary_search_tree

แผนผังการค้นหาไบนารีขนาด 9 และความลึก 3 โดยมี 8 ที่รูท ใบไม่ถูกวาด

ป้อนคำอธิบายรูปภาพที่นี่

และในที่สุดสกีมาที่ยอดเยี่ยมสำหรับการเปรียบเทียบประสิทธิภาพของโครงสร้างข้อมูลและอัลกอริธึมที่รู้จักกันดีนั้นถูกนำไปใช้:

ป้อนคำอธิบายรูปภาพที่นี่

ภาพที่นำมาจากอัลกอริทึม (รุ่นที่ 4)


4

ต้นไม้ไบนารีเป็นต้นไม้ที่เด็กไม่เคยเกินสอง แผนภูมิการค้นหาแบบไบนารีจะตามด้วยค่าคงที่ที่เด็กซ้ายควรมีค่าน้อยกว่าคีย์ของโหนดรูทในขณะที่เด็กที่ถูกต้องควรมีค่ามากกว่าคีย์ของรูทโหนด


4
  • แผนผังการค้นหาแบบไบนารี่: เมื่อทำการ inorder traversal บนต้นไม้แบบไบนารีคุณจะได้รับค่าการเรียงลำดับของรายการที่แทรก
  • ต้นไม้ไบนารี: ไม่พบลำดับการเรียงในการสำรวจเส้นทางใด ๆ

ไม่มีเรียงลำดับจำเป็นต้องพบ แผนภูมิการค้นหาแบบไบนารียังเป็นแผนภูมิแบบไบนารี พวกเขาไม่ได้เป็นพิเศษร่วมกัน BST เป็นชุดย่อยที่เหมาะสมของ BT
มาร์ควิสแห่ง Lorne

3

ในการตรวจสอบสภาพอากาศหรือไม่ต้นไม้ไบนารีที่กำหนดเป็นต้นไม้ค้นหาแบบไบนารีนี่คือวิธีการทางเลือก

Traverse Tree In Inorder Fashion (เช่น Left Child -> Parent -> Child Right), เก็บข้อมูล Traversed Node ในตัวแปรชั่วคราวให้พูดtempก่อนที่จะเก็บไว้ในtempตรวจสอบข้อมูลปัจจุบันของโหนดสูงกว่าก่อนหน้านี้หรือไม่ . จากนั้นก็แยกมันออกมาทรีไม่ใช่ไบนารี่ทรีค้นหามิฉะนั้นจะสิ้นสุดลง

ด้านล่างเป็นตัวอย่างกับ Java:

public static boolean isBinarySearchTree(Tree root)
{
    if(root==null)
        return false;

    isBinarySearchTree(root.left);
    if(tree.data<temp)
        return false;
    else
        temp=tree.data;
    isBinarySearchTree(root.right);
    return true;
}

รักษาตัวแปร temp ไว้ด้านนอก


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

1

ในแผนผังการค้นหาแบบไบนารีโหนดทั้งหมดจะถูกจัดเรียงตามลำดับเฉพาะ - โหนดทางด้านซ้ายของรูตโหนดจะมีค่าน้อยกว่ารูทของมันและโหนดทั้งหมดทางด้านขวาของโหนดจะมีค่ามากกว่าค่าของ ราก.


0

ต้นไม้สามารถเรียกได้ว่าเป็นต้นไม้ไบนารีหากจำนวนสูงสุดของลูกของโหนดใด ๆ คือสอง

ต้นไม้สามารถเรียกได้ว่าเป็นต้นไม้ค้นหาแบบไบนารีถ้าหากจำนวนสูงสุดของลูกของโหนดใด ๆ คือสองและลูกซ้ายจะเล็กกว่าลูกขวาเสมอ

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