c++二叉树层序遍历,c语言二叉树中序遍历
第102条序列遍历(困难?) 0.错误观念1。数组队列初始化2。正在初始化数组3。队列操作思想
这个二叉树的题目毕竟比较难,所以我单独拿出来发了一个解答。
102序列遍历(难?)
Leetcode: 102。二叉树的序列遍历
这个问题相对容易,你可能和我一样不明白问题要求中最后两个参数是干什么用的。
/**
*返回大小为*returnSize的数组的数组。
*数组的大小以* returnColumnSizes数组的形式返回。
*注意:返回的数组和*columnSizes数组都必须被malloced,假设调用者调用free()。
*/
int * * level order(struct TreeNode * root,int* returnSize,int** returnColumnSizes){
}看了一些问题解答,这是理解这个问题的要求。
*returnSize:存储二叉树的层数* * * returnColumnSizes:存储二叉树每层的节点数。返回值必须是int**:需要返回一个指针数组。数组中的每个元素都是一个数组A,数组A存储二叉树每层的节点值。
0.错误的想法。一开始我的想法是用一个单独的函数计算树中节点的个数和级别,然后再次进行序列遍历,得到树的值。
但显然,这个思路在这个题目里是行不通的!
1.数组队列初始化在链式二叉树博客中,我谈到了用队列实现序列遍历的思想。这就是我们在OJ问题上所做的。不同的是,在我自己写的队列实现中,我用的是链式队列。而且最好用数组队列!
#定义最大2000
int * * level order(struct TreeNode * root,int* returnSize,int** returnColumnSizes) {
if (root==NULL)
返回;
struct TreeNode * Queue[MAX];//队列来存储节点的地址。
int front=0,tail=0;//指向队列头和队列尾。2.初始化数组。毕竟这一章会在身边,所以一步一步理解。
* returnSize=0;//将二叉树层次结构初始化为0
//存储二叉树各层节点的值
int * * ret=(int * *)malloc(sizeof(int *)* MAX);
//打开一个数组来存储每层的节点数
* return columnsizes=(int *)malloc(sizeof(int *)*(MAX/2));Ret是一个指针数组,里面存放的是数组A,里面是每一层的节点值。Ret是title *returnColumnSizes打开数组保存每层节点数所需的返回值。其实这里不需要二级指针返回ColumnSizes,但是由于标题是以int**给出的,我们需要先*解引用它,然后malloc打开一个数组。
3.队列操作思路:先将根节点放入队列,tail外循环判断队列是否不为空,如果不为空,停止内循环,对每一层进行入队,从而得到每一层的节点值和编号。在内循环中创建ret数组的子数组,分别存储每层的节点值,最后将每层的节点数赋给* returncolumnsize数组,* returnSize struct TreeNode * head;
queue[tail]=root;//根节点入队
而(前面!=尾巴)
{
int Csize=0;//每层中的节点数
int end=tail
//end是每层最后一个节点的指针。Tail将在后续的入队操作中发生变化,因此需要保存tail的值。
ret[* returnSize]=(int *)malloc(sizeof(int *)*(end-front));
//为每个层打开一个单独的数组来存储值
while(前端)
{
head=Queue[front];
ret[* returnSize][Csize]=head-val;
//数组赋值,而每层的节点数Csize
如果(头-左!=空)
Queue[tail ]=头向左;
如果(头-对!=空)
队列[尾]=头向右;
}
(* return columnsizes)[* returnSize]=Csize;//分配每层的节点数
(* returnSize);//第1层
}
返回ret外循环结束后,ret数组就是此时题目要求的结果。只需返回ret!
这里有个小问题。当树为空时,层次结构应为0。所以我们需要在第一行赋值* returnSize=0;否则,执行会出错。
看了解答才明白这个问题的思路,所以以上只是思路的重复?还是太好吃了!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。