Cây nhị phân

Trong khoa học máy tính, **cây nhị phân** (tiếng Anh: **binary tree**) là một cấu trúc dữ liệu cây mà mỗi nút có nhiều nhất hai nút con, được gọi là **' (''left child'') và **' (*right child*). Một định nghĩa đệ quy chỉ sử dụng các khái niệm lý thuyết tập hợp là cây nhị phân không trống là một tuple (*L*, *S*, *R*), với *L* và *R* là các cây nhị phân hay tập hợp rỗng và *S* là tập đơn (singleton set). Một số tác giả cho phép cây nhị phân cũng có thể là tập hợp trống.

Từ góc độ lý thuyết đồ thị, cây nhị phân (và K-ary) như định nghĩa ở đây thực sự là arborescence. Vì vậy cây nhị phân có thể gọi là **arborescence phân nhánh đôi** (*bifurcating arborescence*)—một thuật ngữ xuất hiện trong các sách lập trình rất cũ, trước khi thuật ngữ khoa học máy tính hiện đại chiếm ưu thế. Cũng có thể hiểu cây nhị phân là một đồ thị vô hướng chứ không phải đồ thị có hướng, trong trường hợp đó cây nhị phân là một cây có gốc và thứ tự Một số tác giả dùng thuật ngữ **cây nhị phân có gốc** thay vì *cây nhị phân* để nhấn mạnh thực tế rằng cây có gốc, nhưng như được định nghĩa ở trên thì cây nhị phân luôn có gốc. Cây nhị phân là trường hợp đặc biệt của cây K-ary, với *k* bằng 2.

## Các loại cây nhị phân
Thuật ngữ về cây không được chuẩn hóa tốt và do đó thay đổi trong các tài liệu.
* Một cây nhị phân ***' có một [[nút gốc]] và mỗi nút có tối đa hai nút con.


* Một cây nhị phân ***' (đôi khi được gọi là **đúng đắn** hay **phẳng** hay cây nhị phân **nghiêm ngặt**) là một cây có mỗi nút đều có hoặc không có hoặc 2 nút con. Một cách định nghĩa khác cho cây nhị phân đầy đủ là một cách định nghĩa đệ quy. Một cây nhị phân đầy đủ gồm:
** Một đỉnh đơn lẻ (một nút đơn lẻ làm nút gốc).
** Một cây có nút gốc có hai nhánh con, cả hai đều là cây nhị phân đầy đủ.
* Một cây nhị phân ***' là một cây nhị phân mà tất cả các nút bên trong đều có hai nút con ''và'' tất cả các nút lá đều có cùng ''độ sâu'' hoặc cùng ''cấp độ'' (cấp độ của một nút được định nghĩa là số đường nối từ nút gốc đến nút đó). Một ví dụ về cây nhị phân hoàn hảo là [[biểu đồ tổ tiên]] của một người đến một độ sâu nhất định nhỏ hơn mức mà tổ tiên sẽ xuất hiện nhiều hơn một lần trong biểu đồ (tại thời điểm này, biểu đồ không còn là một cây có các nút duy nhất; chú ý là cùng một tổ tiên có thể xuất hiện ở các độ sâu khác nhau trong biểu đồ), vì mỗi người có đúng hai cha mẹ sinh học (một mẹ và một cha). Miễn là biểu đồ tổ tiên luôn hiển thị mẹ và cha ở cùng một bên cho một nút nhất định, giới tính của họ có thể được coi là tương đương với nút con trái và phải, ''con'' ở đây được hiểu là một thuật ngữ thuật toán. Một cây nhị phân hoàn hảo là một cây nhị phân đầy đủ, nhưng đảo ngược của nó không nhất thiết đúng.
* Một cây nhị phân ***' là một cây nhị phân trong đó mọi cấp độ, *ngoại trừ có thể là cấp cuối cùng*, đều được lấp đầy hoàn toàn và tất cả các nút ở cấp cuối cùng nằm càng bên trái càng tốt. Nó có thể có từ 1 đến 2*h* nút ở cấp cuối cùng *h*. Một cây hoàn hảo vì vậy luôn luôn là hoàn chỉnh nhưng một cây hoàn chỉnh không nhất thiết hoàn hảo.  Một số tác giả sử dụng thuật ngữ **hoàn chỉnh** để chỉ một cây nhị phân **hoàn hảo** như được định nghĩa ở trên, trong trường hợp đó họ gọi loại cây này (với một cấp cuối không nhất thiết phải lấp đầy) là cây nhị phân **gần như hoàn chỉnh** hoặc **hầu như hoàn chỉnh**. Một cây nhị phân hoàn chỉnh có thể được biểu diễn hiệu quả bằng một mảng.

* Trong cây nhị phân **vô hạn hoàn chỉnh**, cây có {\aleph_0} cấp độ, trong đó ở mỗi cấp độ *d* số nút hiện có ở cấp độ d bằng 2*d*. Số lượng phần tử của tập hợp tất cả các cấp độ là {\aleph_0} (vô hạn đếm được). Số lượng phần tử của tập hợp tất cả các đường đi (các "lá", cứ coi như vậy) là không đếm được, có số lượng của liên tục.
* Một cây nhị phân **cân bằng** là một cấu trúc cây nhị phân trong đó nhánh con trái và nhánh con phải của mỗi nút không chênh lệch về chiều cao (số đường nối từ nút trên cùng đến nút xa nhất trong nhánh con) không quá 1. Người ta cũng có thể xem xét các cây nhị phân trong đó không có lá nào xa gốc hơn các lá khác. (Các lược đồ cân bằng khác nhau cho phép các định nghĩa khác nhau về "xa hơn".)
* Một cây **tàu lượn** (hoặc **bệnh lý**) là một cây mà mỗi nút cha chỉ có một nút con liên quan. Điều này có nghĩa là cây sẽ hoạt động như một cấu trúc dữ liệu danh sách liên kết. Trong trường hợp này, lợi ích của việc sử dụng cây nhị phân bị giảm đáng kể vì nó về cơ bản là một danh sách liên kết có độ phức tạp độ phức tạp thời gian là O(*n*) (*n* là số nút) và nó có nhiều không gian dữ liệu hơn danh sách liên kết do hai con trỏ cho mỗi nút, trong khi độ phức tạp O(log2*n*) cho tìm kiếm dữ liệu trong cây nhị phân cân bằng thường được mong đợi.
## Xem thêm
* Ahnentafel
* Cây AVL
* Cây đỏ đen
* Cây splay

## Tham khảo

### Trích dẫn

### Thư mục
* Donald Knuth. *[[The Art of Computer Programming]] vol 1. Fundamental Algorithms*, Third Edition. Addison-Wesley, 1997. . Section 2.3, especially subsections 2.3.1–2.3.2 (pp.&nbsp;318–348).

## Liên kết ngoài

* binary trees  entry in the FindStat database
* Gamedev.net introduction on binary trees 
* Binary Tree Proof by Induction 
* Balanced binary search tree on array How to create bottom-up an Ahnentafel list, or a balanced binary search tree on array
* Binary trees and Implementation of the same with working code examples