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





