654.最大二叉树
由于题目要求是在数组上选最大为根,该最大值左边的元素构建左子树,右边的元素构建右子树,也就是将所给数组进行合理的切分,看到二叉树的题目就想遍历顺序,这道题用先序遍历更为合适,先构造根节点再递归地构造其左子树和右子树
class Solution {
public:
int findMax(vector<int>& nums){
int maxIndex=-1;
int max=0;
for (int i = 0; i < nums.size(); ++i) {
if(nums[i]>max){
max=nums[i];
maxIndex=i;
}
}
return maxIndex;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size()==1) {//终止条件是数组被切分到仅有一个元素
return new TreeNode(nums[0]);
}
int index= findMax(nums);
TreeNode*root= new TreeNode(nums[index]);//构造根节点
if(index>0){//最大值的左边还有至少一个元素递归构建左子树,否则终止
vector<int> leftNums(nums.begin(),nums.begin()+index);
root->left= constructMaximumBinaryTree(leftNums);
}
if(index<nums.size()-1){//最大值的右边还有至少一个元素递归构建右子树,否则终止
vector<int> rightNums(nums.begin()+index+1,nums.end());
root->right= constructMaximumBinaryTree(rightNums);
}
return root;
}
};
617.合并二叉树
用层序遍历进行合并,保证同时遍历两颗树的同一位置,这样就可以达到:两棵树都有的结点值相加,一棵树有一棵树没有的结点,移动到结果树里
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1== nullptr)return root2;
if(root2== nullptr)return root1;
queue<TreeNode*> q;
q.push(root1);
q.push(root2);
while (!q.empty()){
TreeNode*node1=q.front();
q.pop();
TreeNode*node2=q.front();
q.pop();
node1->val+=node2->val;
if(node1->left!= nullptr&&node2->left!= nullptr){
q.push(node1->left);
q.push(node2->left);
}
if(node1->right!= nullptr&&node2->right!= nullptr){
q.push(node1->right);
q.push(node2->right);
}
if(node1->left== nullptr&&node2->left!= nullptr){
node1->left=node2->left;
}
if(node1->right== nullptr&&node2->right!= nullptr){
node1->right=node2->right;
}
}
return root1;
}
};
700.二叉搜索树中的搜索
由于二叉搜索树的有序特性,所以给定目标值后,若根节点的值小于目标值则去右子树搜索,反之则去左子树搜索
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == NULL || root->val == val) return root;
TreeNode* result = NULL;
if (root->val > val) result = searchBST(root->left, val);
if (root->val < val) result = searchBST(root->right, val);
return result;
}
};
98.验证二叉搜索树
验证左子树和右子树均为二叉搜索树,二叉搜索树的常用遍历方式是中序遍历,用pre
指针跟踪前一个结点的值,从左向右遍历,遇到pre
结点的值大于等于当前结点的值的情况,就可以说明这棵树不是二叉搜索树
class Solution {
public:
TreeNode*pre=nullptr;
bool isValidBST(TreeNode* root) {
if(root==nullptr)return 1;
int left=isValidBST(root->left);
if(pre!=nullptr&&pre->val>=root->val)return false;
pre=root;
int right=isValidBST(root->right);
return left&&right;
}
};