构建二分检索树并输出特定的某一行

it2026-08-13  14

思路:每次构建树的时候返回一个值,该值代表这个LEAF在树的第几层。构建一个数组用于储存每一层元素的个数。在preorder的时候根据这些值选择要不要把找到的element打印出来。(因为上一个代码我写的是leveloedertracersal所以用了这个方法)

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct tree{ int element; struct tree* left; struct tree* right; }TREE; typedef struct tree *Tree; typedef struct queue{ struct tree* numQ[1000]; int front; int rear; }Queue; Queue Q; Tree Insert(Tree T, int d); int CheckFloor(Tree T, int d, int check); void Push(struct tree* root); struct tree* Pop(); void LevelOrderTraversal (Tree T, int sum, int level); int main() { int N=0; int Floor[100]={0}; int initial[50]; int times=0; int k=0; int level=0; int Level; int sum=0; int FLOOR=0; Tree T=NULL; scanf("%d",&N);//输入N个数字// for(int i=0;i<N;i++)//放入二叉树里// { scanf("%d,",&initial[i]); T=Insert(T,initial[i]); k=CheckFloor(T,initial[i],1); Floor[k]++;//找到每一级有多少个元素// } scanf("%d",&Level);//打出第Level行的元素// for(int i=1;i<Level;i++) { sum=sum+Floor[i];//前sum个数不printf// } for(int i=1;i<100;) { while(Floor[i]!=0) { FLOOR=i;//找到二叉树有多少层// i++; } break; } if(Level>FLOOR)//如果想打的行数大于已有行数// { printf("-1"); } else { level=Floor[Level];//该Level行有level个元素// LevelOrderTraversal(T, sum, level);//层序遍历储存到数组里// //printf("sum=%d, level=%d",sum, level);//查询sum以及level// //putchar('\n');// } return 0; } void Push(struct tree* root) { Q.numQ[Q.rear++]=root; } /*int Pop() { int func; func=Q->numQ[rear--]; return func; }*/ struct tree* Pop() { //出队 return Q.numQ[Q.front++]; } void LevelOrderTraversal (Tree T, int sum, int level) { //二叉树的层次遍历 Tree temp; Push(T); int m=0; while (Q.rear!=Q.front) { temp = Pop(); m++; if(m>sum&&m<=sum+level) { printf("%d,", temp->element); //输出队首结点 } if (temp->left) //把Pop掉的结点的左子结点加入队列 Push(temp->left); if (temp->right) //把Pop掉的结点的右子结点加入队列// Push(temp->right); } } int CheckFloor(Tree T, int d,int check) { if(T==NULL) { return check; } else { if(d<T->element) { check++; return CheckFloor(T->left,d,check); } else if(d>T->element) { check++; return CheckFloor(T->right,d,check); } else { return check; } } } Tree Insert(Tree T, int d) { if(T==NULL)//构建一个新的节点// { T=(Tree)malloc(sizeof(TREE)); T->element=d; T->left=T->right=NULL; } else { if(d<T->element) { T->left=Insert(T->left, d); } else if(d>T->element) { T->right=Insert(T->right,d); } } return T; }
最新回复(0)