if(T爲空){ 返回 } if (s->data > T->data){ T->rchild=s; 返回; } 遞歸T->rchild; else if(s->data<T->data){ if(T->lchild爲空){ T->lchild=s; 返回; } 遞歸T->lchild; } }
if(樹爲空){ s爲根節點; } else{ SearchNode(tree, s); } }
for(i=0;i<數組長度;i++){ s申請內存; s->data=a[i]; s的左右孩子爲NULL; } }
刪除操做較複雜須要分三中狀況:
(1)刪除節點的左孩子爲空
(2)刪除節點的右孩子爲空
(3)刪除節點有左右子樹ios
函數須要用到&符號,這須要對實參進行刪除。數組
申請空間後刪除記得使用free()。函數
void DeleteNode(BTree &T, int x){ if(T爲空){ 返回; } 尋找元素位置; else{ if(T->lchild爲空){ 申請temp; T=T->rchild free(temp); } else if(T->rchild爲空){ 申請temp: temp等於其rchild; free(temp); } else{ 申請temp和其前驅pre; while(temp->rchild){ pre=temp; temp等於其rchild; } tree->data=temp->data; if(pre!=T){ temp的lchild賦值給pre的rchild; } else{ temp的lchild賦值給pre的lchild; } free(temp); } }
#include<iostream> using namespace std; #define length 12 typedef struct BTNode { int data; struct BTNode* lchild, * rchild; }BTNode, * BTree; void SearchNode(BTree& T, BTree& s) { if (T == NULL) return; if (s->data > T->data) { if (T->rchild == NULL) { T->rchild = s; return; } SearchNode(T->rchild, s); } else if (s->data < T->data) { if (T->lchild == NULL) { T->lchild = s; return; } SearchNode(T->lchild, s); } } void InsertNode(BTree& tree, BTree& s) { if (tree == NULL) tree = s; else SearchNode(tree, s); } void CreatBTree(BTree& tree, int* a) { for (int i = 0; i < length; i++) { BTree s = new BTNode; s->data = a[i]; s->lchild = NULL; s->rchild = NULL; InsertNode(tree, s); } } void DeleteNode(BTree& T, int x) { if (T == NULL) return; if (x > T->data) DeleteNode(T->rchild, x); else if (x < T->data) DeleteNode(T->lchild, x); else { if (T->lchild == NULL) { BTree temp = T; T = T->rchild; free(temp); } else if (T->rchild == NULL) { BTree temp = T; temp = temp->rchild; free(temp); } else { BTree pre, temp; pre = T; temp = T->lchild; { pre = temp; temp = temp->rchild; } T->data = temp->data; if (pre != T) pre->rchild = temp->lchild; else pre->lchild = temp->lchild; free(temp); } } } void Inorder(BTree tree) { if (tree == NULL) return; Inorder(tree->lchild); cout << tree->data << " "; Inorder(tree->rchild); } int main() { int n; int a[length] = { 50,30,80,20,40,90,10,25,35,85,23,88 }; BTree tree = NULL; CreatBTree(tree, a); cout << "中序輸出:"<<endl; Inorder(tree); cout << endl; cout << "需刪除的節點:" << endl; cin >> n; cout <<"中序輸出:"; DeleteNode(tree, n); Inorder(tree); return 0; }