这是二叉搜索树的一些基本概念。https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91/7077855?fr=aladdin二叉搜索树具有如下特点:
- 根节点的值大于左子树的值,根节点的值小于右节点的值。
- 中序遍历的结果是从下到大。(与其构成的原理有关)
- 最大值一定在右子树上。最小值一定在左子树上。
要构建二叉树,首先构建起每个结点的构成,这里,使用结构体来表示其结构;在这里要强调,指针和成员变量的关系,如果使用了指针为参数,在调用结构体时要是用箭头来调用其中的成员。
typedef struct node{
int date;
struct node*left;
struct node*right;
}Node;
typedef struct{
Node *root;
} Tree;
现在就开始创建二叉树,使其结构完整。先判断是否存在根节点,如果有就判断左子树或右子树,否则把传入的值作为根节点赋值。
void insert(Tree* tree, int value){
Node* node = (Node *)malloc(sizeof(Node));
node->date = value;
node->left = NULL;
node->right = NULL;
if(tree->root == NULL){
tree->root = node;
}else{
Node* temp = tree->root;
while(temp != NULL){
if(value < temp->date){
if(temp->left == NULL){
temp -> left = node;
return ;
}else{
temp = temp->left;
}
}else{
if(temp->right == NULL){
temp -> right = node;
return ;
}else{
temp = temp->right;
}
}
}
}
}
现在就是对二叉树来说比较重要的遍历先序,中序,后序;这个以前博客有写过(https://blog.csdn.net/ab1605014317/article/details/87926393)只要把握住,先序是(根->左->右), 中序(左->根->右),后序(左->右->根);就可以使用递归的方法来解决。
void preorder(Node *node){
if(node != NULL){
printf("%d\n",node->date);
preorder(node->left);
preorder(node->right);
}
}
void inorder(Node *node){
if(node != NULL){
inorder(node->left);
printf("%d\n",node->date);
inorder(node->right);
}
}
void postorder(Node *node){
if(node != NULL){
postorder(node->left);
postorder(node->right);
printf("%d\n",node->date);
}
}
再就是求深度;首先我们要是到在二叉树中递归是经常使用的方法。如果对递归不是太了解就先在网上看看,了解一下,这样更有利于学习;深度肯定就是比较左子树和右子树的深度,取大值就好;
int get_height(Node *node){
if(node == NULL){
return 0;
}else{
int left_h = get_height(node -> left);
int right_h = get_height(node -> right);
int man = left_h;
if(right_h > man){
man = right_h;
}
return man + 1;
}
}
当然也有非递归的算法:
int get_h(Node* node){
if(node == NULL) return 0;
int hh = 0;
int wh = 0;
Node* q = (Node *)malloc(sizeof(q));
queue<Node*>qu;
qu.push(node);
while(!qu.empty()){
wh = qu.size();
hh++;
for(int i = 0;i < wh; i++){
q = qu.front();
qu.pop();
if(q->left){
qu.push(q->left);
}
if(q->right){
qu.push(q->right);
}
}
}
return hh;
}
最后就是求出最大值,一种适用于所有的二叉树。另一种只适用于二叉搜索树:
int get_maxnum(Node *node){
if(node == NULL)return -1;
else{
int m1 = get_maxnum(node->left);
int m2 = get_maxnum(node->right);
int m3 = node->date;
int man = m1;
if(m2 > man) man = m2;
if(m3 > man) man = m3;
return man;
}
}
int get_maxnn(Node *node){
if(node == NULL) return -1;
else{
int m1 = get_maxnn(node -> right);
int maxnn = node->date;
if(m1 > maxnn)maxnn = m1;
return maxnn;
}
}
当然这个也有非递归的写法,自己尝试一下;