目录
一、LeetCode二叉树:
题目描述:
层次遍历的基本思路是从上到下,从左到右进行遍历,我们进行碰到数据的过程和要处理的过程方向是一致的,所以最好使用队列queue数据结构:在while循环中,每处理一个数据,一次把它的左子节点(如果有的话)和右子节点(如果有的话)入队,直到队列变空。在进入下一层的入队。
int **result = (int **)malloc(sizeof(int*)*SIZE);//定义一个二维数组存储
struct TreeNode *queue[SIZE]; //定义队列
int rear = 0;
int head = 0; // 首位开始都在0,此时为空
int *key = (int*)malloc(sizeof(int)*SIZE);
memset(key, 0, sizeof(int)*SIZE);//将0赋给key
if (root == NULL)//如果根结点为零,则返回NULL
return NULL;
queue[rear] = root;//将根结点入队
rear = (rear + 1) % SIZE;//队列数组往后加1
int height = 0;//深度
key[height] += 1;//从第一层开始
while (head != rear) //如果位置上的值不为空,依次遍历
{
height += 1;//进入下一深度
int i = 0;
result[height - 1] = (int *)malloc(sizeof(int) * key[height - 1]);//给这一层分配相应的空间
while (i < key[height - 1]) //遍历每一层的数
{
root = queue[head];//出队
head = (head + 1) % SIZE;//移动下一位
result[height - 1][i++] = root->val;//二维数组的第[height-1][i++]放入值val
if (root->left)//如果存在左结点
{
queue[rear] = root->left;//左结点进入队列
rear = (rear + 1) % SIZE;
key[height] += 1;
}
if (root->right)//如果存在右结点
{
queue[rear] = root->right;
rear = (rear + 1) % SIZE;
key[height] += 1;
}
}
}
*columnSizes = key;
*returnSize = height;
return result;//返回这个二维数组
二、二叉树的三种遍历方式
什么是二叉树
- 二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
- 性质:
- 性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
- 性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
- 性质3:包含n个结点的二叉树的高度至少为(log2n)+1
- 性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
满二叉树,完全二叉树:
- 满二叉树,度为0和2的二叉树;
- 完全二叉树,只有最下面两层节点,度小于2的二叉树;
- 完全二叉树,若设二叉树的高度为h,除第h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
- 完全二叉树,度为1的节点要么为0,要么为1。
一些性质:
- 如果一棵完全二叉树的结点总数为n,那么叶子结点等于n/2(当n为偶数时)或者(n+1)/2(当n为奇数时)
- 定义n为节点总个数,n0是度为0的个数,n1是度为1的个数,n2是度为2个数。
- 则有n=n0*0+n1*1+n2*2+1 ; n = n0+n1+n2 。
- n0=n2+1。
先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。