- 1.在循环体中定义局部变量
for(int i=0;i<n;i++){
.......
}
我们很常做的一件事就是在for循环里定义一个变量并初始化(如上面定义的i,初始化为1),这个变量有可能是为了做循环限制而定义的,而此时变量只做为for循环的局部变量
循环结束后就不能再使用i这个变量。
- 2.内存分配
定义指针 需要动态分配内存 root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
二维数组:*arr=arr[0],**arr=arr[0][0];
int (*p)[4] = a;
*arr= arr[0]=&arr[0][0];
*arr+1=&arr[0][1]=&arr[0][0]+1;
*(arr+1)=arr[1];
换算成地址进行相加 ,数组不能直接相加
- 3.重建二叉树
递归注意终止条件
注意特殊情况
struct TreeNode* reConstructBinaryTree(int* pre, int preLen, int* vin, int vinLen ) {
/*前序: 根 左孩子 右孩子
中序:左孩子 根 右孩子
1.保存根节点
2.得到左子树的前序和中序;得到右子树的前序和中序
3.保存左右孩子
4. 递归;
*/
//处理边界 特殊情况
if (preLen == 0)
return NULL;
//终止条件
if (preLen ==1){
struct TreeNode* root;
root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = pre[0];
root->left =NULL;
root->right =NULL;
return root ;
}
//保存根节点
struct TreeNode* root;
root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root -> val = pre[0];
//得到左前序和中序
int a=0,b=0,c=0,k=1;
for( a=0;a < preLen; a++){
if (vin[a] == pre[0]) break;
}
//申请两个数组
int lpre[a],lvin[a];
int rpre[preLen - 1-a],rvin[preLen - 1-a];
for(int i=0;i < a; i++){
lpre[i] = pre[k++];
lvin[i] = vin[i];
}
for(int i = a + 1;i < preLen;i++) {
rpre[b++] = pre[i];
rvin[c++] = vin[i];
}
int lpreLen = a,lvinLen = a;
int rpreLen = preLen - 1-a,rvinLen = preLen - 1-a;
root ->left = reConstructBinaryTree( lpre, lpreLen, lvin, lvinLen );
root ->right = reConstructBinaryTree( rpre, rpreLen, rvin, rvinLen );
return root;
}