1.将有序数组转化为二叉搜索树
题目描述:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
解题思路:
二分递归求
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.empty()) return nullptr;
return helper(nums,0,nums.size()-1);
}
TreeNode* helper(vector<int>& nums,int a,int b){
if(a>b) return nullptr;
int middle = (a+b)>>1;
TreeNode* root = new TreeNode(nums[middle]);
root->left = helper(nums,a,middle-1);
root->right = helper(nums,middle+1,b);
return root;
}
};
2.二叉树的层次遍历
题目描述:
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
解题思路:
就是二叉树的层次遍历,用到队列,和数组
1.先把根入队
2.只要队列不空,记录队列size,遍历队列中元素
3.依次取出元素,并把他们放入临时数组
4.分别判断他们的左右子树是否为空,不为空就入队
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>>res;
if(nullptr == root) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
vector<int> temp;
int len = q.size();
for(int i = 0;i<len;++i){
TreeNode* now = q.front();
q.pop();
temp.push_back(now->val);
if(nullptr != now->left){
q.push(now->left);
}
if(nullptr != now->right){
q.push(now->right);
}
}
res.push_back(temp);
}
reverse(res.begin(),res.end());
return res;
}
};
3.最长公共前缀
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解题思路:
1.如果数组为空,那么返回空
2.选择第一个字符串作为对照标准
3.两层遍历
4.相等continue,不等删除,break
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
string res = strs[0];
for(int i = 1;i<strs.size();++i){
for(int j = 0;j<res.size();++j){
if(res[j] == strs[i][j]) continue;
else{
res.erase(j);
break;
}
}
}
return res;
}
};
4.不同的二叉搜索树II
题目描述:
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
5.不同的二叉搜索树