2012-02-21 79 views
5

Tôi đang làm việc trên cây tìm kiếm nhị phân.sử dụng con trỏ kép thay vì con trỏ đơn

Vì vậy, đây là cấu trúc được sử dụng để đại diện cho các nút:

typedef struct TreeNode 
{ 
int num; 
struct TreeNode *left,*right; 
}TREENODE; 

Để chèn một nút trong cây Tôi đã sau phương pháp signatire

void InsertNode(TREENODE **root,int data); 

Trong các phương pháp trên tại sao chúng ta yêu cầu con trỏ đôi.Chúng tôi có thể sử dụng một con trỏ duy nhất!

Chúng tôi có sử dụng con trỏ kép để tránh trùng lặp không?

+0

Sounds nghi ngờ giống như bài tập về nhà ... – Nick

+0

@Nick nó được, nhưng câu hỏi hợp lệ. – Andrey

+0

Tôi sẽ gắn thẻ nó như vậy rồi – Nick

Trả lời

7

Không, điều này là cần thiết trong trường hợp tái cân bằng. Sau khi tái cân bằng gốc có thể được thay đổi.

Ok, tôi sẽ mở rộng. Con trỏ kép cho phép bạn sửa đổi con trỏ. Vậy gốc cây là gì trong trường hợp của bạn? Con trỏ đến TREENODE. Một số thao tác như tìm kiếm sẽ không bao giờ sửa đổi nó. Nhưng một số hoạt động có thể cần phải thay đổi nó để một nút khác trở thành gốc mới. Vì vậy, họ phải có quyền truy cập vào biến mà bạn sử dụng như là người chủ. Một ví dụ tại sao họ có thể cần nó là tái cân bằng, xem AVL trees.

+2

này. Khi bạn sử dụng một con trỏ, nút gốc sẽ luôn trỏ đến nút mà bạn đã đưa ra làm đối số. nhưng khi một số cân bằng, nút gốc thay đổi, con trỏ của bạn đến gốc cũng cần phải thay đổi. Đó là lý do tại sao bạn cần một con trỏ đến một con trỏ. (root không chỉ là biến đầu vào ở đây mà cả biến thể đầu ra nữa) – Hayt

+1

@Hayt Andrey nhận nó ... thxxx ... u người r genius ... – Anirudha

+0

Nó không nhất thiết phải "tái cân bằng". Ai nói có bất kỳ sự tái cân bằng nào được thực hiện ở đó? Nó có thể là thực tế chỉ là lần đầu tiên chèn vào một cây trống sẽ thay đổi gốc từ con trỏ null thành một con trỏ không null. – AnT

2

Nếu chúng tôi cần con trỏ kép, thì chúng ta cần sửa đổi con trỏ trỏ đến.

0

Nó rất phụ thuộc vào cách bạn sử dụng cây. nếu cây nên giữ trên một số loại phân loại, do đó, chèn có thể thay đổi nút gốc, vì vậy bạn cần con trỏ đôi.

+0

vâng .. một cây đã được sắp xếp .. – Anirudha

2

Không - bạn đang sử dụng điểm kép để bạn có thể sửa đổi con trỏ.

0

Sử dụng "Con trỏ kép" cho phép bạn thay đổi Nội dung của bộ nhớ <some_class>* giữ địa chỉ của. Vì vậy, về cơ bản chúng tôi bảo toàn trạng thái của vị trí bộ nhớ ngay cả khi có cuộc gọi chức năng bên ngoài. Sử dụng khác giống như cho ví dụ: char* (như Chuỗi), và char** (như mảng của chuỗi)

Bạn có thể tìm thấy câu trả lời của tôi trong một thread: Why use double pointer? or Why use pointers to pointers?

Các vấn đề liên quan