LeetCode Binary Tree Inorder Traversal
2016-02-02 17:24
197 查看
C语言非递归+栈的方法。
这种方法,比较好理解,只不过因为*returnSize这个指针类型,导致经常出错。
递归方法。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int *nums=NULL,i=0;
void inorder(struct TreeNode* root)
{
nums = (int *)realloc(nums, sizeof(int)*(i+1));
if(root){
inorder(root->left);
nums[i++]=root->val;
inorder(root->right);
}
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize=0;
i=0;
if(root==NULL)
return NULL;
else
{
nums = (int *)malloc(sizeof(int));
inorder(root);
*returnSize=i;
return nums;
}
}
经过两天的调试,这个递归算法终于让我解出来了
在调试过程中发现几个问题。
1、全局变量,不知为何发生了变化,为不影响局部数据,需重新赋值。
2、malloc,realloc等动态划分的时候,有指针变量一定要动态分配内存,不然一定会有栈溢出错误。
2016/2/2
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ /** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */
//非递归,利用栈。 int* inorderTraversal(struct TreeNode* root, int* returnSize) { struct TreeNode** stack=NULL,*pre=root; *returnSize=0; int i=0,j=0,*nums=NULL; stack = (struct TreeNode **)malloc(sizeof(struct TreeNode *)); nums = (int *)malloc((j+1)*sizeof(int)); while(i||pre) { if(pre){ stack = (struct TreeNode **)realloc(stack, sizeof(struct TreeNode *)*i+1); stack[i++]=pre; pre=pre->left; } else{ pre=stack[--i]; nums = (int *)realloc(nums, sizeof(int)*(j+1)); nums[j++]=pre->val; *returnSize+=1; pre=pre->right; } } return nums; }
这种方法,比较好理解,只不过因为*returnSize这个指针类型,导致经常出错。
递归方法。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int *nums=NULL,i=0;
void inorder(struct TreeNode* root)
{
nums = (int *)realloc(nums, sizeof(int)*(i+1));
if(root){
inorder(root->left);
nums[i++]=root->val;
inorder(root->right);
}
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize=0;
i=0;
if(root==NULL)
return NULL;
else
{
nums = (int *)malloc(sizeof(int));
inorder(root);
*returnSize=i;
return nums;
}
}
经过两天的调试,这个递归算法终于让我解出来了
在调试过程中发现几个问题。
1、全局变量,不知为何发生了变化,为不影响局部数据,需重新赋值。
2、malloc,realloc等动态划分的时候,有指针变量一定要动态分配内存,不然一定会有栈溢出错误。
2016/2/2
相关文章推荐
- c++指针
- 用go开发的足球预测分析网站上线了
- Android--字符串和16进制相互转化(解决中文乱码)
- 阿里云营收结构和基础设施规模
- 如何在Ubuntu / CentOS 6.x上安装Bugzilla4.4
- 10023---使用Node.js+Socket.IO搭建WebSocket实时应用
- Androidx学习笔记(41)---使用异步HttpClient(android-async-http-master)做Post提交
- Nginx深入详解之upstream分配方式
- background-position还可以这样用
- HTTP访问控制(CORS)
- 函数库regexec匹配正则表达式
- 深入解析C#中的泛型类与泛型接口
- hibernate之hibernate.cfg.xml详解
- Androidx学习笔记(40)--- 使用异步HttpClient(android-async-http-master)做get提交
- JavaScript中的对象(二)——原型对象
- Identity Card
- [控件]支持索引的ExpandableListView
- 第三方登陆遇到的 问题
- MyBatis的foreach语句详解
- JMS基础(1)