列出叶结点

    科技2022-07-16  130

    对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

    输入格式:

    首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。

    输出格式:

    在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:

    8 1 - - - 0 - 2 7 - - - - 5 - 4 6

    输出样例:

    4 1 5 #include<stdio.h> #include<stdlib.h> #include<queue> using namespace std; typedef struct NODE no; typedef no *bstree; typedef bstree ptr; struct NODE{ int data; ptr l,r; }; char num[12][2]; int co=0; ptr creat_tree(bstree p,int i)//递归建树 { p=(ptr)malloc(sizeof(no)); p->data=i; p->l=p->r=NULL; if(num[i][0]!='-') { p->l=creat_tree(p->l,num[i][0]-48); } if(num[i][1]!='-') { p->r=creat_tree(p->r,num[i][1]-48); } return p; } void l_o_t(bstree t)//层序遍历 { int cot=0; ptr tep; queue<bstree>dd; dd.push(t);//首先根节点入队 while(!dd.empty()) { tep=dd.front();//取出队头元素 dd.pop();//删除队头元素 if(!tep->l&&!tep->r)//叶节点,输出 { cot++; if(cot==co)printf("%d",tep->data); else printf("%d ",tep->data); } if(tep->l) dd.push(tep->l);//有左孩子,加入队列 if(tep->r) dd.push(tep->r); //有右孩子,加入队列 } } int main(void) { int n; scanf("%d",&n); getchar(); int flag[20]={0}; for(int i=0;i<n;i++) { scanf("%c%*c%c",&num[i][0],&num[i][1]); if(num[i][0]=='-'&&num[i][1]=='-') co++;//为了输出格式空格的需求 flag[num[i][0]-48]=1;//找出根节点 flag[num[i][1]-48]=1; getchar(); } int root; for(int i=0;i<n;i++) { if(!flag[i]) { root=i; break; } } // printf("%d\n",root); bstree rootp=creat_tree(rootp,root); // printf("%d",rootp->l->data); l_o_t(rootp); return 0; }

     

    Processed: 0.008, SQL: 8