构造二叉排序树|C语言题解

104 阅读1分钟

1716088535604.png

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 
typedef struct node
{
    int key;
    struct node *lchild, *rchild;
}Node, *BST;
 
BST BSTInsect(BST root, int element) {
	BST q, p, s;
	q = NULL;//q为p的双亲节点,根节点无双亲节点 
	p = root;//p为正在查看的节点,初始从根节点t开始 
	while(p != NULL) {
		if(element == p->key) return 0;//在当前二叉树中找到x,不用插入
		q = p;//更新双亲节点 
		if(element < p->key) p= p->lchild;//如果x比当前节点小,则进入左子树
		else p = p->rchild; //如果x比当前节点大,则进入右子树 
	}
	s = (BST)malloc(sizeof(Node));//没找到x,做插入,申请节点空间
	s->key = element; s->lchild = NULL; s->rchild = NULL;//s存放x,设为叶节点
	if(q == NULL) root = s; //若原先的二叉树是一棵空树,新插入的x对应的节点s为插入后二叉树的根节点
	else if(element < q->key) q->lchild = s;//若x小于其双亲节点,则作为其左孩子
	else q->rchild = s;//若x大于其双亲节点,则作为其右孩子
	return root; 
} 

 //root的高度就是二叉树的最大深度,用后序遍历,就是层次数
int getLevel(BST root){
//这里输入你的代码
    if(root == NULL) return 0;
    int leftheight = getLevel(root->lchild);
    int rightheight = getLevel(root->rchild);
    int height = fmax(leftheight, rightheight) +1;
    //注意c语言函数是fmax,不是max
    return height;

}


void inOrderTraverse(BST root){
    if(root != NULL){
        inOrderTraverse(root->lchild);
        printf("%d ", root->key);
        inOrderTraverse(root->rchild);
    }
}
 
int main(){
    int n,i,element,level;
    BST root = NULL;
    scanf("%d", &n);
    for(i=0;i<n;i++){
        scanf("%d", &element);
        root = BSTInsect(root, element);
    }
    level = getLevel(root);
    printf("%d\n", level);
    inOrderTraverse(root);
    return 0;
}