这段代码,在后面跑测试用例时,出现了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. python内置模块之re模块

    内容概要 re模块常用方法 findall search match re模块其他方法 split sub subn compile finditer findall 对无名分组优先展示 re实战之爬 ...

  2. CentOS7下Jumpserver V3.0 部署

    环境准备 # 准备一台 2核4G (最低)且可以访问互联网的 64 位 Centos 7 主机 [root@localhost ~]# hostnamectl --static set-hostnam ...

  3. IP网络主动测评系统

    一.IT网络运维面临的挑战 1. 网络性能可视化 • 与公有云和SaaS平台连接的可靠性 • 广域网线路性能 • 互联网专线性能 2.诊断工具 • 现场无IT工程师覆盖 • 诊断的人力费用 • 网络与 ...

  4. ISISv4协议测试——网络测试仪实操

    文章关键词 ISIS协议:路由协议:协议测试: 一.文章简介: isis是一种与ospf很相似的网络协议(属于动态路由协议),它被应用在巨大规模网络,如运营商以及银行等.同样的它也是基于链路状态算法, ...

  5. Vue 源码解读(9)—— 编译器 之 优化

    前言 上一篇文章 Vue 源码解读(8)-- 编译器 之 解析 详细详解了编译器的第一部分,如何将 html 模版字符串编译成 AST.今天带来编译器的第二部分,优化 AST,也是大家常说的静态标记. ...

  6. git问题:gpg failed to sign the data fatal: failed to write commit object问题

    今天用版本控制工具git提交时一直出现的问题:gpg  failed to sign the data fatal: failed to write commit object, gpg是一个加密软件 ...

  7. 系统资源监控——联用awk与grep文本处理工具,截取磁盘使用量字段

    一.使用到的命令行 1.df : df -h #将磁盘使用量用表的形式呈现. 2.awk: awk '{print $5}' #默认分隔符是空格,$后的数字是指定从第几列开始截取. awk -F [] ...

  8. C++ 部分函数

    string库 1.size()与length() 字符串长,结果相同 string s; s.length(); //s.length()-1是最后一个字符的下标,而不是'\0' for(i=0;i ...

  9. pandas补充(其二)与matplotlib补充

    今日内容概要 pandas补充知识(2) matplotlib补充知识 今日内容详细 pandas补充 数据汇总 # 数据透视表 pd.pivot_table(data,values-None,ind ...

  10. c语言刷 DFS题记录

    144. 二叉树的前序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeN ...