二叉树
- [力扣LCR 145](#力扣LCR 145)
- [力扣 226](#力扣 226)
-
- [力扣 236](#力扣 236)
力扣LCR 145
学到了:
node* p = new node{成员1,成员2};//申请一个node型结构体变量,并初始化成员- 二叉树层次插入可以先将数组保存到一个数组里,再根据数组下标递归插入
cpp
TreeNode*bulidTree(int i){//i为数组下标
if(i>n||a[i]==-1){//-1代表为空
return nullptr;
}
TreeNode*node=new TreeNode{a[i],bulidTree(2*i),bulidTree(2*i+1)};
return node;
}
new不需要头文件,malloc需要stdlib.h头文件- 无论在什么地方
malloc或new,都必须释放,否则会导致内存泄漏 - 内存分配和释放要配对,如:
int* p = new int;-->delete p;
int* arr = new int[2];-->delete[] arr;
int* p = (int)malloc(sizeof(int));-->free(p);
以后要注意:
- 二叉树递归的出口要明确,不要漏掉了
力扣 226
学到了:
-
层序遍历
- 层序遍历是指按层次的顺序 从根结点向下 逐层进行遍历,且对同一层的结点为从左到右遍历。
- 基本思路:
- 将根结点 root 加入队列 q。
- 取出队首结点,访问它。
- 如果该结点有左孩子,将左孩子入队。
- 如果该结点有右孩子,将右孩子入队。
- 返回第2点,直到队列为空。
cpp
queue<TreeNode*> q; //注意这个队列存的是地址
q.push(root); //根节点地址入队
while(!q.empty()){
TreeNode*node=q.front();//取队首元素
q.pop();
printf("%d ",node->val);//访问队首元素
if(node->left) { //左子树非空
q.push(node->left);
}
if(node->right) { //右子树非空
q.push(node->right);
}
}
以后要注意的:
- 不要用脑子想递归的过程,递归都有返回值,像本题,返回左右孩子,直接交换左右孩子就是答案,不要模拟向下的过程,把递归函数想象成一个黑盒子,返回值就是你要的某个必要的值,直接用这个值计算就行
- 写递归代码时从下往上想,基本情况处理好了想第二层怎么调用刚刚处理好的基本情况,以此递推
力扣 236
这题与上面的题差不多,都是基于递归来写的,但是情况比较多,在纸上写好需要应对的情况就好了
学到了:
- devc++遇到段错误(比如等待一段时间后输出没结果),可以直接点上面的√调试(如需输入的话先输入),它会直接定位到发生段错误的代码行上
以后要注意的:
- 发生段错误且定位到代码行后,注意分清楚字母和数字(比如"i"和"1"),字母和数字在编程软件上显示是不同的
- 题目情况多的情况下把所有情况写在纸上,再写代码