本题要求的是叶结点 就是度为0的结点 并且要按照上下 左右的顺序输出。
一
首先要找到根节点 求根节点的方法就是找到那个没有其他结点的左右子结点能够指到的位置 那个位置就是根节点。
树的顺序存储结构的具体方法是多加一个root的变量
struct node{
int left;
int right;
int root;
}tree[maxsize];
首先给所有的root赋值令其为-1;
然后在输入数据的时候令tree[子节点.left] = 0 tree[子节点.right] = 0;
所以最后tree[i].root = -1的那个i 就是根节点。
二
再进行遍历。
遍历二叉树输出叶子结点 可以使用前序遍历
void preorder(beetree bt)
{
if(bt){
if(!bt->left&&!bt->right)
printf("%d\n",bt->data);
preorder(bt->left);
preorder(bt->right);
}
}
前序遍历是按照从左到右的顺序输出叶子结点 并不能保证从上到下 所以要使用层序遍历。
queue<int>qu;
int node = root;
qu.push(root);
int space = 0;
while(qu.empty()!=true){
node = qu.front();
qu.pop();
if(tree[node].left==-1&&tree[node].right==-1){
if(space) printf(" ");//space用来控制输出 保证最后没有多余空格
printf("%d",node);
}
if(tree[node].left!=-1) qu.push(tree[node].left);
if(tree[node].right!=-1) qu.push(tree[node].right);
}
#include<stdio.h>
struct Tree{
int data;
int left;
int right;
}tree[15];
void levelorder(int root,int yezi){
int queue[15];
int front = -1,rear = -1;
if(root==-1) return;
queue[++rear] = root;
int num = 0;
while(front!=rear){
root = queue[++front];
if(tree[root].left==-1&&tree[root].right==-1){
num++;
if(num!=yezi) printf("%d ",root);
else printf("%d",root);
}
if(tree[root].left!=-1) queue[++rear] = tree[root].left;
if(tree[root].right!=-1) queue[++rear] = tree[root].right;
}
}
int main()
{
int n;
scanf("%d",&n);
int check[15] ={0};
int sum = 0;
for(int i=0;i<n;i++){
char c1,c2;
scanf("\n%c %c",&c1,&c2);
if(c1=='-'&&c2=='-') sum++;
if(c1=='-'){
tree[i].left = -1;
}else{
tree[i].left = c1-'0';
check[tree[i].left] = 1;
}
if(c2=='-'){
tree[i].right = -1;
}else {
tree[i].right = c2-'0';
check[tree[i].right] = 1;
}
}
int root =-1,j;
for(j=0;j<n;j++){
if(check[j]==0) break;
}
root = j;
if(root!=-1){
levelorder(root,sum);
}
return 0;
}