2022.4.28 在循环体中定义局部变量 内存分配 重建二叉树

  • 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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值