void thaythe(tree &t,node *p) { if(t->left) thaythe(t->left,p); //nếu nhánh bên trái còn tức là khác NULL thì tiếp tực nhảy đến nhánh bến trái //cho đến khi nào nó là cực trái thì thôi else//nó đã là node cực trái { p->key=t->key; //p là con trỏ truyền vào, mọi thay đỏi về bộ nhớ, ô nhớ hay giá trị đều thay đỏi trên //hàm xoa(tree &t,int x) đã gọi nó. //lúc này p là node cần xóa ở hàm xóa, ta không xóa node mà thay thế giá trị cho nó //rồi chuyển nó đến 1 ô nhớ khác, //ô nhớ mà t đang tìm để thay thế để hàm xoa() gọi delete nó. p=t;//node t là node ta đã tìm ra để thay thế //nên p=t; tức là sẽ xóa T thay cho p ban đầu //nên p(node sẽ xóa ở hàm ngoài) nhảy đến ô nhớ của node thay thế là node T , p=t; t=t->right; //vì t sẽ bị xóa thông qua p nên t phải nhay đến nhánh bên phải //để làm liến mạch liên kết với cha như đã lý giải ở hàm xóa //vì sao lại trỏ right là không phải trỏ left? //vì T là node thay thế, là node cực trái, //tức nhánh trái = NULL còn nhánh phải có thể khác NULL //hoắc bằng NULL, t không cần xác định, chỉ cần //trỏ t->right để làm liền mạch liên kết đến node cha đã gọi đến nó //là ok. } } void xoa(tree &t,int x)//hàm xóa node trong cây nhị phân tìm kiếm { if(t)//nếu cây t!=NULL { if(x<t->key) xoa(t->left,x);//nếu x < key xóa bên trái else if(x>t->key) xoa(t->right,x);//xóa bên phải else//đã tìm thấy node cần xóa { node *p=t;//gán node cần xóa cho p if(t->left==NULL) t=t->right; //nếu node cần xóa có 1 cây con bên phải else if(t->right==NULL) t=t->left; //hoặc 1 cây con bên trái //thì T được truyền vào trong đối số hàm nhảy sang trái hoăc sang phải như trên //vì sao nó liên kết được với node cha?? //vì node cha đang trỏ đến con trỏ t (tree &t) //ở dạng tham chiếu luôn nên mọi thay đổi trên t //thì đều thay đổi trên cấu trúc của node cha, node gọi đến hàm này //vì thế node cha của node cần xóa hiện tại //sẽ trỏ đến t, và khi t=t->right; thì //node cha của node cần t cần xóa vẫn đang trỏ //đến t với giá trị là ô địa chỉ mới t->right; else thaythe(t->right,p); //nếu ndoe t cần xóa có 2 nhánh con thì tìm node cực trái của nhánh phải //hoặc ngược lại cũng có thể được delete p; } } //lưu ý cần nhớ. //khi đối số của hàm là còn trỏ hoặc tham chiếu //thì mọi thay đổi trên nó đều thay đổi đến biến của hàm đã gọi nó, //thay đổi đến cụ diện chung của biến, của hàm đã gọi nó. }
Thursday, June 11, 2015
hàm xóa node trong cây nhị phân tìm kiếm
hàm xóa node trong cây nhị phân tìm kiếm
Related Posts:
tính giá trị biểu thức bằng cây nhị phânlập trình c++ trính giá trị biểu thức toán học gồm số nguyên, dấu ngoặc (), phép toán +-*/ bằng phương pháp cây nhị phân. #include<iostream> #include<string> using namespace std; typedef struct tagnode { st… Read More
cấu trúc cây trong lập trình c/c++ cấu trúc cây trong lập trình c/c++, cấu trúc cây rất quan trọng trong lập trình quản lý dữ liệu Định Nghĩa Cây Cây là một tập hợp T các phần tử (gọi là nút của cây), trong đó có một nút đặc biệt gọi là nút gốc, các nút … Read More
cấu trúc cây nhị phân tìm kiếm và các thao tác trên cây cấu trúc cây nhị phân tìm kiếm và các thao tác trên cây. định nghĩa, và các thao tháo cần thiết phải có khi cài đặt 1 cay nhị phân tìm kiếm Ðịnh nghĩa cây nhị phân tìm kiếm Cây nhị phân Bảo đảm nguyên tắc bố trí khoá tại … Read More
hàm xóa node trong cây nhị phân tìm kiếmhàm xóa node trong cây nhị phân tìm kiếm void thaythe(tree &t,node *p) { if(t->left) thaythe(t->left,p); //nếu nhánh bên trái còn tức là khác NULL thì tiếp tực nhảy đến nhánh bến trái //cho đến khi nào n… Read More