题解 | #输出二叉树的右视图#

输出二叉树的右视图

http://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0

返回二叉树层序遍历的每层最后一个节点值即可 重构二叉树+层序遍历二叉树+输出每层最后一个节点值

//重构二叉树
struct TreeNode* reConstruct(int* xianxu, int xianxuLen, int* zhongxu, int zhongxuLen){
    if(xianxuLen==0)
       return NULL;
    struct TreeNode* head=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    head->val=xianxu[0];
    int k=0;
    int left_length=0;
    int right_length=0;
    while(xianxu[0]!=zhongxu[k]){
        k++;
    }
    left_length=k;
    right_length=zhongxuLen-k-1;
    head->left=reConstruct(xianxu+1, left_length, zhongxu, left_length);
    head->right=reConstruct(xianxu+k+1, right_length, zhongxu+k+1, right_length);
    return head;
}

//层序遍历二叉树
int** leveltraves(struct TreeNode* Thead, int* returnSize,int* returnCsize){
    if(Thead==NULL){
        return NULL;
    }
    *returnSize=0;
    int** res=(int**)malloc(sizeof(int*)*10000);
    struct TreeNode* q[10000];
    int head=0,tail=0;
    q[tail++]=Thead;
    while(head!=tail){
        int pretail=tail;
        int k=0;
        res[*returnSize]=(int*)malloc(sizeof(int)*pretail-head);
        while(head!=pretail){
            struct TreeNode* p=q[head];
            res[*returnSize][k++]=p->val;
            if(p->left){
                q[tail++]=p->left;
            }
            if(p->right){
                q[tail++]=p->right;
            }
            head++;
        }
        returnCsize[*returnSize]=k;
        (*returnSize)++;
    }
    return res;
}
//主函数
int* solve(int* xianxu, int xianxuLen, int* zhongxu, int zhongxuLen, int* returnSize ) {
    if(xianxuLen==0){
        return NULL;
    }
    //重构二叉树
    struct TreeNode* Thead=reConstruct(xianxu, xianxuLen, zhongxu, zhongxuLen);
    //层序遍历二叉树
    int returnCsize[10000];
    int** res=leveltraves(Thead, returnSize,returnCsize);
    //将每一层的结点个数取出放入一个数组中(可以整合到下一步中,单独写出来比较清楚)
    int count_of_each_level[*returnSize];
    for(int i=0;i<*returnSize;i++){
        count_of_each_level[i]=returnCsize[i];
    }
    //将每一层最后一个结点输出
    int resArry[*returnSize];
    for(int i=0;i<*returnSize;i++){
        int j=count_of_each_level[i];
        resArry[i]=res[i][j-1];
    }
	return resArry;
}
全部评论

相关推荐

评论
1
收藏
分享
牛客网
牛客企业服务