题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列。

  用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子。中序遍历的顺序正好是序列从小到大的顺序,因此中序遍历的时候顺便赋值就可以了,最后层次遍历输出。

思路一:中序遍历的时候赋值

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <queue>
#define LEFT 0
#define RIGHT 1
using namespace std;
const int maxn=105;
int cnt=0;
/*
中序遍历的顺序即为序列从小到大的顺序,因此中序遍历的时候顺便赋值,
最后层次遍历输出即可。
*/
struct Node{
    int val;
    int left;
    int right;
}node[maxn];

void dfs(int i,int*a){
    if(i==-1)
        return;
    dfs(node[i].left,a);
    node[i].val=a[cnt];
    cnt++;
    dfs(node[i].right,a);
}

int main()
{
    int n,l,r;
    int a[maxn];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&l,&r);
        node[i].left=l;
        node[i].right=r;
    }
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    dfs(0,a);
    queue<Node>q;
    q.push(node[0]);
    bool first=true;
    while(!q.empty()){
        Node tmp=q.front();
        q.pop();
        if(first){
            printf("%d",tmp.val);
            first=false;
        }
        else{
            printf(" %d",tmp.val);
        }
        if(tmp.left!=-1)
            q.push(node[tmp.left]);
        if(tmp.right!=-1)
            q.push(node[tmp.right]);
    }

    return 0;
}
View Code

相关文章: