102. 二叉树的层序遍历

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/ /**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes)
{
struct TreeNode *queue[2001];
int front = 0, rear = 0; if (root != NULL) {
queue[rear++] = root;
} int **res = (int **)malloc(sizeof(int *) * 2001);
*returnColumnSizes = (int *)malloc(sizeof(int) * 2001);
*returnSize = 0; while (front < rear) {
int colIndex = 0;
// 申请内存
int last = rear;
res[(*returnSize)] = (int *)malloc(sizeof(int) * (last - front));
while (front < last) {
// 取出当前节点
struct TreeNode *curNode = queue[front++];
res[(*returnSize)][colIndex++] = curNode->val; if (curNode->left != NULL) {
queue[rear++] = curNode->left;
}
if (curNode->right != NULL) {
queue[rear++] = curNode->right;
}
}
(*returnColumnSizes)[(*returnSize)] = colIndex;
(*returnSize)++;
}
return res;
}

226. 翻转二叉树

这道题注意:写指针的Swap的时候,要取指针的地址,即二级指针

方法1:递归(前序遍历)

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/ void Swap(struct TreeNode **left, struct TreeNode **right)
{
// printf("begin left:%p, right:%p\n", left, right);
struct TreeNode *tmp = *left;
*left = *right;
*right = tmp;
// printf("end left:%p, right:%p\n", left, right);
} struct TreeNode* invertTree(struct TreeNode* root)
{
if (root == NULL) {
return root;
}
// 前序:中 左 右
// printf("Swap前 end left:%p, right:%p\n", root->left, root->right);
Swap(&root->left, &root->right);
// printf("Swap后 end left:%p, right:%p\n", root->left, root->right);
// struct TreeNode* temp = root->left;
// root->left = root->right;
// root->right = temp; invertTree(root->left);
invertTree(root->right);
return root;
}

方法2:迭代(前序遍历)

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/ void Swap(struct TreeNode **left, struct TreeNode **right)
{
struct TreeNode *tmp = *left;
*left = *right;
*right = tmp;
} struct TreeNode* invertTree(struct TreeNode* root)
{
struct TreeNode *stack[10];
int index = 0; if (root != NULL) {
stack[index++] = root;
}
while (index != 0) {
// 取出当前节点(准备交换左右子节点)
struct TreeNode *curNode = stack[--index];
if (curNode == NULL) {
break;
}
Swap(&curNode->left, &curNode->right);
// 上面已经交换完了,这里安装前序遍历正常顺序(如果不是翻转的需要则逆序,由于是栈)
if (curNode->left != NULL) {
stack[index++] = curNode->left;
}
if (curNode->right != NULL) {
stack[index++] = curNode->right;
}
}
return root;
}

最新文章

  1. 安装ArcGIS Desktop 9.3
  2. 控制反转(IOC)
  3. hibernate-聚合函数分组统计数据查询
  4. jQuery组件系列:封装标签页(Tabs)
  5. iOS开发-VFL(Visual format language)和Autolayout
  6. jdom学习读取XML文件
  7. Spark生态之SparkR
  8. XML DOM 总结一
  9. C++ BitArray 引用计数实现
  10. Allegro绘制PCB流程
  11. 客房收费系统改造(三)—厂+反射+DAL
  12. Chapter 16_4 私密性
  13. 【转载】CentOS 6.4下PXE+Kickstart无人值守安装操作系统
  14. flask-login ----系统权限设计部分小结
  15. webpack学习记录 二
  16. my work
  17. POJ_2376_Cleaning Shifts【贪心】【区间覆盖】
  18. CF 317 A. Lengthening Sticks(容斥+组合数学)
  19. Java多线程——线程封闭
  20. HTTP vs HTTPS

热门文章

  1. vivo数据库与存储平台的建设和探索
  2. Linux 配置 kibana
  3. Java中的String,StringBuilder,StringBuffer三者的区别?
  4. List去重复
  5. unicode家族
  6. 统信UOS系统部署.Net Core 5.0
  7. Android文件的权限概念
  8. MySQL server has gone away 异常
  9. docker基础——5.Dockerfile
  10. 实现redis哨兵,模拟master故障场景