二叉查詢樹建立,遍歷,查詢元素很容易實現。我主要寫寫刪除過程。
二叉查詢樹結點的刪除分幾種情況:
如果結點是一片樹葉,那麼直接刪除即可。如果結點有乙個兒子,則該節點可以在其父節點調整指標繞過該節點後被刪除。如果結點有兩個兒子,一般的刪除方法是用其右子樹的最小的資料代替該節點,並刪除那個結點。因為最小的那個結點不可能有左兒子,所以第二次刪除很容易實現。
**如下,寫的不太好,見笑了
#include#include#includetypedef int datatype;
typedef struct node
bintree, *tree;
// 新增結點
tree add_new_node(datatype data)
// 二叉查詢樹的插入操作
tree insert(tree root, datatype num)
else if (num > root->data)
else if (num < root->data)
return root;
}// 根據關鍵字找到該結點並返回該節點的位址
tree find(tree root, datatype key)
// 在二叉查詢樹樹中找到最小的結點的值(遞迴)
tree findmin(tree root)
// 在二叉查詢樹樹中找到最大的結點的值(迭代)
tree findmax(tree root)
return root;
}// 找到關鍵字的父節點並返回它本身的位址和父節點的位址,以及其左右子樹對應關係
tree findnodeandpos(tree root, datatype key, tree *flag,int *sign)
else if (key > p->data)
else
return p;
} return null;
}// 刪除的結點有1個或兩個結點
void delete_a_node_with_one_child(tree parent,tree dest,int pos)
// 左子樹不為空右子樹為空
else if (dest->lchild != null && dest->rchild == null)
// 左右子樹均為空
else
free(dest);
}// 刪除函式
void delete_node_with_pos(tree root, datatype key)
else
// 當待刪除結點沒有左右子樹時
if (dest->lchild == null && dest->rchild == null)
delete_a_node_with_one_child(parent, dest, pos);
// 當待刪除結點左右子樹均存在時
else if (dest->lchild!=null && dest->rchild!=null)
// 當待刪除結點只有乙個子樹時
else
delete_a_node_with_one_child(parent, dest, pos); }}
// 清空整個樹
tree makeempty(tree root)
return null;
}// 前序遍歷
void preorder(tree root)
}// 中序遍歷
void inorder(tree root)
}// 後序遍歷
void postorder(tree root)
}// 以三種遍歷方式列印出所有結點
void print(tree root)
int main()
root = insert(root, 45);
print(root);
printf("\n刪除乙個結點後\n\n");
delete_node_with_pos(root, 58);
print(root);
printf("\n");
root = makeempty(root);
system("pause");
return 0;
}
資料結構之二叉查詢樹
針對二叉查詢樹的操作 增刪改查 的時間和樹的高度成正比,比如都有10個節點的乙個樹,樹高為4和樹高為10的操作時間肯定是不同的,這個時間實際上是o lgn 二叉查詢樹的期望的樹高是lgn,從而基本動態集合的操作平均時間為 lgn 通常二叉查詢樹基於鍊錶實現,每個節點儲存左,右子節點,如果想更方便的實...
資料結構之二叉查詢樹
二叉樹成為二叉查詢樹的性質是,對於樹種的每個節點x,他的左子樹中的所有關鍵字的值均小於x的關鍵字的值,而他的右子樹中的所有關鍵字的值均大於x的關鍵字的值。這意味著,該樹的所有元素均可以是用某種統一的方式排序。tree.h pragma once we define the binary tree.s...
資料結構之二叉查詢樹
二叉查詢樹 binary search tree 又被稱為二叉搜尋樹。設x為二叉查詢樹中的乙個結點,x節點包含關鍵字key,節點x的key值記為 ke y x k ey x 如果y是x的左子樹中的乙個結點,則 ke y y ke y x k ey y ke y x 如果y是x的右子樹的乙個結點,則 ...