二叉搜索树是一种独特的结构,其遍历是按顺序输出元素,基本建立过程是:插入一个值,判断与根结点的元素大小,小于根就进左子树,大于根就进右子树。
实现过程如下:
typedef struct node { //树的结点
int data;
struct node* left;
struct node* right;
}*N, treeNode;
typedef struct { // 树的根
treeNode * root;
}Tree;
void insertnode(Tree *tree, int value) { // 注意函数的参数 传进来一个指向树的指针
N newnode;
newnode = (N)malloc(sizeof(treeNode)); //创建新结点
newnode->data = value;
newnode->left = NULL;
newnode->right = NULL;
if (tree->root == NULL) { // 如果树为空,则让新结点作为根
tree->root = newnode;
}
else { // 当进行上面的操作后 ,树肯定不为空了
N temp = tree->root; // 然后新建结点temp,让其从根部开始往下搜索,
while (temp != NULL) {
if (value < temp->data) { // 如果value < temp->data(也就是上面创建的那个根的值)
if (temp->left == NULL) { // 小于的话那肯定往左边走,如果temp的左子树为空,直接插入newnode为左子树就完事
temp->left = newnode;
return;
}
else { // 这里temp的左子树不为空,那就往下呗 ,为空就直接插入newnode
temp = temp->left;
}
}
else {
if (value > temp->data) { // 这是value 大于 temp->data 的情况 ,跟上面一样,很好理解的啦
if (temp->right == NULL) {
temp->right = newnode;
return;
}
else {
temp = temp->right;
}
}
}
}
}
return;
}
还有就是搜索操作:
N findnode2(int x, N BST)
{
if (BST == NULL) {
return NULL;
}
while (BST) {
if (x > BST->data) {
BST = BST->right;
}
else if (x < BST->data) {
BST = BST->left;
}
else {
return BST;
}
}
}
插入操作:
N Insertnode(int x , N T)
{
if (!T) { // 空树
T = (N)malloc(sizeof(treeNode));
T->data = x;
T->left = NULL;
T->right = NULL;
}else {
if (x > T->data) {
T->right = Insertnode(x, T->right);
}
else if (x < T->data)
{
T->left = Insertnode(x, T->left);
}
}
return T;
}
找最大值:往右子树找到底就是最大的,最小值往左子树找到底
具体实现(找最大值为例):
N findmax(N MAX) {
if (MAX) {
while (MAX->right) {
MAX = MAX->right;
}
return MAX;
}
}
中序遍历:
void printtree(N nodee) {
if (nodee != NULL) {
printtree(nodee->left);
cout << nodee->data<<" ";
printtree(nodee->right);
}
}
主函数:
int main()
{
Tree tree; // 创建一棵树
tree.root = NULL; // 树根指向空
int n;
cin >> n; // 输入n , 意思是有多少个结点
for (int i = 1; i <= n; i++) {
int temp;
cin >> temp; // 输入temp 为结点的值
insertnode(&tree, temp); // 注意这里的实参,传进去树的地址(也可以说指向树的指针)
}
int x; // 输入x 进行插入操作
cin >> x;
tree.root = Insertnode(x, tree.root); // 插入函数
printtree(tree.root); // 遍历函数 (这里采用中序遍历)
cout << endl;
return 0;
}