题目:请用C语言写出二叉树的二叉链表结构,并编写一个函数在二叉搜索树(二叉排序树、二叉查找树)中可以搜索给定的关键字
难度:★
二叉排序树(二叉搜索树、二叉查找树、BST树)的特性
二叉排序树又称为二叉查找树,它是一种特殊的二叉树。
其定义为:二叉树排序树或者是一棵空树,或者是具有如下性质的二叉树:
(1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
(2)若它的右子树非空,则右子树上所有结点的值均大于(或大于等于)根结点的值;
(3)它的左右子树也分别为二叉排序树。
这是一个递归定义。
二叉树的二叉链表结构
#include<stdio.h>
#include<stdlib.h>
//二叉树的结点结构
typedef struct Node{
int data;//存放结点数据
struct Node *left;//左子树指针
struct Node *right;//右子树指针
}Node,*BiTree;
二叉排序树中查找指定关键字
递归算法
算法思路:根据二叉排序树的特性,左<根<右,进行递归遍历查找
BiTree searchNode(BiTree root,int key){
//递归出口
if(root==NULL||root->data==key){
return root;//返回存储待查找关键字的节点
} else if(key<root->data){
return searchNode(root->left,key);
} else {
return searchNode(root->right,key);
}
}
非递归算法
BiTree searchNode(BiTree root,int key){
//若树为空或者关键字等于根结点值则结束循环
while(root!=NULL&&key!=root->data){
if(key<root->data){
root=root->left;
} else{
root=root->right;
}
}
return root;
}
二叉搜索树的插入
算法思路: 先判断树是否为空树,若为空树则需要将第一个插入的结点作为根结点,利用C语言中的malloc函数申请一个结点内存空间,并初始化左右子树指针为空;若不为空树则根据二叉排序树的特性:左<根<右 进行递归地插入。注意:参数列表中Node*代表数的结点指针类型,&root表示取出当前结点的地址。
递归算法
//二叉搜索树的插入(递归方式)
void InsertNode(BiTree root,int key){
//原始树为空则新插入的结点作为根结点
if(root==NULL){
root=(BiTree)malloc(sizeof(Node));
root->data=key;
root->left=root->right=NULL;
}else if(key<root->data){
InsertNode(root->left,key);
}else {
InsertNode(root->right,key);
}
}
非递归算法
//二叉搜索树的插入(非递归方式)
int InsertNode(BiTree T,int key){
if(!Search(T,e,NULL)){
BiTree s=(BiTree)malloc(sizeof(Node));
s->data=key;
s->lchild=s->rchild=NULL;
if(!p){
T=s;root=T;
}else if(key<p->data){
p->lchild=s;
}else{
p->rchild=s;
}
return 1;
}
return 0;
}
插入上没有递归,但其实是先递归搜索待插入的叶子结点,还是带一点递归在里面的
3.C语言小知识点:指针类型 * 与取地址符& 的用法
参考文章
扫描二维码关注公众号,回复:
17207462 查看本文章