这段代码,在后面跑测试用例时,出现了stack-overflow,但是原因还不清楚。

问题如下:

 二叉树的层次遍历
 

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

因为要输出一个二维数组,那么我需要定义一个两重链表,具体定义如下:
/* 链表节点 用于存储输出结果 */
struct listNode {
int val;
struct listNode *next;
}; struct list {
int count;
struct listNode *head;
struct listNode *tail;
struct list *next;
}; struct list_list
{
int count;
struct list *head;
struct list *tail;
};

链表的一些操作如下:

void init_list(struct list *l)
{
l->count = 0;
l->head = NULL;
l->tail = NULL;
l->next = NULL;
} void init_list_list(struct list_list *l)
{
l->count = 0;
l->head = NULL;
l->tail = NULL;
} void add_new_node(struct list *l, struct listNode *node)
{
if (!l->head)
{
l->head = node;
l->tail = node;
l->count = 1;
return;
} l->tail->next = node;
l->tail = node;
l->count++;
} void add_new_list(struct list_list *ll, struct list *l)
{
if (ll->head == NULL)
{
ll->head = l;
ll->tail = l;
ll->count = 1;
return;
} ll->tail->next = l;
ll->tail = l;
ll->count++;
}

链表创建如下:

struct list_list * create_list_list()
{
struct list_list *ll = malloc(sizeof(struct list_list));
if (ll)
{
init_list_list(ll);
}
return ll;
}
struct list * create_list()
{
struct list *l = malloc(sizeof(struct list));
if (l)
{
init_list(l);
} return l;
}

另外需要定义一个队列,用于存放每个树节点

/* 队列节点,用于存储已经遍历过的根节点 */
struct queue_node
{
void *entry;
struct queue_node *next;
}; struct queue {
struct queue_node *front;
struct queue_node *rear;
};

队列的一些简单操作实现如下:

/* 队列节点,用于存储已经遍历过的根节点 */
struct queue_node
{
void *entry;
struct queue_node *next;
}; struct queue {
struct queue_node *front;
struct queue_node *rear;
}; void init_queue(struct queue *q)
{
q->front = NULL;
q->rear = NULL;
} void queue_push(struct queue *q, void *np)
{
struct queue_node *node = malloc(sizeof(struct queue_node));
node->entry = np;
node->next = NULL; if (q->rear == NULL)
{
q->rear = node;
q->front = node;
}
else
{
q->rear->next = node;
q->rear = node;
}
} void *queue_pop(struct queue *q)
{
struct queue_node *np = q->front;
void *entry = NULL;
if (np)
{
entry = np->entry;
if (np->next == NULL)
q->rear = NULL;
q->front = np->next;
free(np);
} return entry;
}
struct queue * create_queue()
{
struct queue *q = malloc(sizeof(struct queue));
if (q)
{
init_queue(q);
}
return q;
}

主函数的具体实现思想为,遍历根节点,将其存入队列中,然后在队列中插入一个flag标记,之后进入一个while循环,循环中,每次从队列中取出一个成员,将该成员存入到用于输出的二层链表中,然后判断其左右孩子是否为空,不为空,则其左右孩子入队列。然后再循环,当从队列中取出的是flag标志后,并且队列中还没空,那么就在这个队列中再插入一个flag标志,表示这一层的遍历结束,可以输出这一层的链表。如此循环,直到所有节点都入队列,读到最后一个flag标记,并且队列为空,那么整个遍历流程结束。后面就是把二层链表输出成一个二维数组。

代码如下:

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
struct list_list *ll;
struct list *subList;
struct listNode *head;
struct queue *q;
struct TreeNode *pNode = NULL;
struct listNode *newnode = NULL;
int **r;
int *subr;
struct list *l;
int i,j;
int *size;
int *resize; if (!root || !returnSize || !returnColumnSizes)
return; q = create_queue();
ll = create_list_list();
l = create_list();
add_new_list(ll, l);
queue_push(q, (void*)root);
queue_push(q, FINISH_FALG); while (q->front != NULL)
{
pNode = (struct TreeNode *)queue_pop(q);
if (pNode == FINISH_FALG)
{
if (q->front == NULL)
break;
/* 创建新的链表,在总链表中插入新的链表 */
l = create_list();
add_new_list(ll, l); /* 在当前队列中再插入一个终结标志 */
queue_push(q, FINISH_FALG);
continue;
} /* 该节点插入到当前链表中 */
newnode = create_node(pNode->val);
add_new_node(l, newnode); /* 将当前节点的左右孩子加入队列中 */
if (pNode->left != NULL)
{
queue_push(q, (void*)pNode->left);
}
if (pNode->right != NULL)
{
queue_push(q, (void*)pNode->right);
}
} r = (int **)malloc(sizeof(int *) * ll->count);
resize = (int *)malloc(sizeof(int *) * ll->count);
subList = ll->head;
while(subList && i < ll->count)
{
subr = (int *)malloc(sizeof(int) * subList->count);
head = subList->head;
j = 0;
while(head && j < subList->count)
{
subr[j] = head->val;
j++;
head = head->next;
} resize[i] = subList->count; r[i] = subr;
i++;
subList = subList->next;
}
*returnSize = ll->count;
*returnColumnSizes = resize;
return r;
}

(leetcode)二叉树的层次遍历-c语言实现的更多相关文章

  1. LeetCode 二叉树的层次遍历

    第102题 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...

  2. LeetCode 二叉树的层次遍历 C++

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层 ...

  3. (leetcode)二叉树的前序遍历-c语言实现

    给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 前序遍历 前序遍历首先 ...

  4. LeetCode 107 ——二叉树的层次遍历 II

    1. 题目 2. 解答 与 LeetCode 102 --二叉树的层次遍历 类似,我们只需要将每一层的数据倒序输出即可. 定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level ...

  5. LeetCode:二叉树的层次遍历||【107】

    LeetCode:二叉树的层次遍历||[107] 题目描述 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,2 ...

  6. LeetCode 102. 二叉树的层次遍历(Binary Tree Level Order Traversal) 8

    102. 二叉树的层次遍历 102. Binary Tree Level Order Traversal 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 每 ...

  7. LeetCode 102. Binary Tree Level Order Traversal 二叉树的层次遍历 C++

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  8. Leetcode 102 二叉树的层次遍历 Python

    二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7],   3   / \ 9 20 ...

  9. Leetcode题目102.二叉树的层次遍历(队列-中等)

    题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...

随机推荐

  1. Ubuntu18配置静态IP地址

    1. 记住网卡名称 ifconfig 2. 记住网关地址 netstat -rn 3. 配置静态IP 注意:Ubuntu18固定IP的方式跟Ubuntu18之前版本的的配置方式不同, Ubuntu18 ...

  2. 在线pdf请你谨慎打开

    本篇其实算之前安全整改话题的一点补充,对之前内容感兴趣的可以走以下快捷通道: 安全漏洞整改系列(二) 安全漏洞整改系列(一) 背景 前不久某家客户对我们提供的系统又进行了一轮安全测试,其中有一条我觉得 ...

  3. 轻量级DI框架Guice使用详解

    背景 在日常写一些小工具或者小项目的时候,有依赖管理和依赖注入的需求,但是Spring(Boot)体系作为DI框架过于重量级,于是需要调研一款微型的DI框架.Guice是Google出品的一款轻量级的 ...

  4. ACM对抗赛有感

    2022.2.22 一个有"爱"的日子,注定不会平凡(对于24oier来说),原因是gg让我们参加与大连理工大学的对抗赛. 为此队友都准备好各种板子,上了比赛才发现根本没有 可怜了 ...

  5. python中面向对象VS面向过程

    面向过程编程:首先分析出解决问题所需要的步骤(即"第一步做什么,第二步做什么,第三步做什么"),然后用函数实现各个步骤,再依次调用. 面向对象编程:会将程序看作是一组对象的集合,用 ...

  6. Java邮件发送中的setRecipient方法使用

    ​ 一.方法setRecipient(Message.RecipientType type, Address address),是用于设置邮件的接收者. 1.有两个参数,第一个参数是接收者的类型,第二 ...

  7. 基于C#打造的OPCUA客户端应用

    OPC UA (Unified Architecture),是工业4.0的标准通信规范,大家现在都不陌生. 目前大部分工控行业的应用系统都逐渐的在向OPC UA靠拢,所以随着iot的发展,OPC UA ...

  8. 浅谈bi工具的含义和不同类型

    ​什么是BI工具? 商业智能(BI)工具是利用一组方法和技术来准备,呈现和帮助分析数据的工具.通过此过程,数据将转化为可操作的业务信息,帮助决策者和最终用户做出更有效的数据驱动决策. 商业智能使用的一 ...

  9. 市场竞争白热化,Smartbi Excel分析助力企业提高核心竞争力

    ​近年来,随着企业的数字化转型,数据已经成为企业的重要资产,用来支撑其业务决策.对业务数据进行全方位的分析,及时发现问题,调整经营策略,是企业做大做强的必要手段之一.特别是在市场竞争白热化的行业,更需 ...

  10. 零售BI解决方案_新零售时代转型升级思路全都在这里

    新零售是什么意思?新零售即企业以互联网为依托,通过运用大数据.人工智能等先进技术手段,对商品的生产.流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务.线下体验以及现代物流进行深度融合 ...