力扣第16天----第654题、第617题、第700题、第98题
一、第654题–最大二叉树
构造二叉树,一定要前序遍历----先确定中间节点的数值,再链接到左右子树上。中间节点数值,通过遍历,找出来。然后再递归方式----把左右子树中间节点,给整个二叉树的中间节点做链接。
class Solution { // 左闭右闭
public:
TreeNode* construct(vector<int>& nums, int left, int right){ //函数名字里,有左右节点的位置,所以要重新再def一个函数。
if (right - left == 0) return new TreeNode(nums[left]); //采用“左闭右闭”构建方式,终止条件是左右相等,这时构建一个节点。
int maxv = 0; //找出中间节点数值,再构建新的节点。
int index = 0;
for (int i = left; i <= right; i++){
if (nums[i] > maxv){
maxv = nums[i];
index = i;
}
}
TreeNode* node = new TreeNode(maxv);
if (index - left >= 1){ //单层递归条件。如果左边能构建子树,左边链接上。
node ->left = construct(nums, left, index-1);
}
if (right - index >=1){ //单层递归条件。如果右边能构建子树,右边链接上。
node -> right = construct(nums, index + 1, right);
}
return node; //返回节点
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) { //调用函数。
return construct(nums, 0, nums.size() - 1);
}
};
二、第617题–合并二叉树
这是一道简单题,采用前序遍历。终止条件–两个子树有一个是空,就返回另一个;单层逻辑,根节点的值相加,root1和root2的左子树再合并一起,root1和root2的右子树再合并一起。返回整个二叉树的根节点。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (root1 == nullptr) return root2; // 终止条件
if (root2 == nullptr) return root1;
root1->val += root2->val; //单层逻辑,根节点处理方式
root1 -> left = mergeTrees(root1->left, root2->left); //单层逻辑,左右子树的逻辑。递归方式,合并每个子树
root1 -> right = mergeTrees(root1->right, root2->right);
return root1;
}
};
三、第700题–二叉搜索树中的搜索
利用BST的特性,采用前序遍历。终止条件–没找到、找到了,都返回root(没找到的话,当前节点root就是nullptr)。单层递归逻辑–val大于当前根节点数值,就向右侧找;反之,向左侧找。逐渐递归,找到最终的root(找到或者找不到,都返回root节点)。
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == nullptr || root->val == val) return root;
TreeNode* result;
if (val > root->val) result = searchBST(root->right , val);
if (val < root->val) result = searchBST(root->left, val);
return result;
}
};
四、第98题–验证二叉搜索树
这是一道好题。采用中序遍历+双指针。设置2个指针,左指针、右指针分别对应于BST中的“左中右”里的“左中”和“中右”。这2个指针逐个移动,每次都移动1个位置,然后逐个比较。
先处理“左”,得到左子树是否为BST。再按照上面双指针思路,判断中是否满足递增。再判断右子树是否为BST。
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (root == nullptr) return true;
bool left = isValidBST(root->left);
if ( pre != nullptr && pre->val >= root->val){
cout << pre->val << ' ' <<root->val << endl;
return false;
}
// if ( pre != nullptr ) cout << pre->val << '-' <<root->val << endl;
pre = root;
bool right = isValidBST(root->right);
return left && right;
}
TreeNode* pre = nullptr;
};