LeetCode 654.最大二叉树
题目链接:LeetCode 654.最大二叉树
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* root = new TreeNode(0);
if(nums.size() == 1)
{
root -> val = nums[0];
return root;
}//特判:数组中只有一个数时直接构造二叉树返回
int maxrootval = 0;
int maxindex = 0;
for(int i = 0;i < nums.size();i++)
{
if(nums[i] > maxrootval)
{
maxrootval = nums[i];
maxindex = i;
}
}//找到数组中最大值及其下标
root -> val = maxrootval;//构造根节点
if(maxindex > 0)
{
vector<int> leftroot(nums.begin(),nums.begin() + maxindex);
root -> left = constructMaximumBinaryTree(leftroot);
}//左子树不为空时构造左子树
if(nums.size() - 1 - maxindex > 0)
{
vector<int> rightroot(nums.begin() + maxindex + 1,nums.end());
root -> right = constructMaximumBinaryTree(rightroot);
}//右子树不为空时构造右子树
return root;
}
};
思路:通过前序遍历,先找到数组中的最大值及其下标,用该值来构造二叉树根节点;再通过下标将数组进行切分;最后将切分的数组作为左右子树继续进行遍历。
小结:在进行左右子树的构造时,先要判断切分后的数组是否为空,不为空时才能继续进行构造。
LeetCode 617.合并二叉树
题目链接:LeetCode 617. 合并二叉树
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == NULL)
return root2;
if(root2 == NULL)
return root1;
root1 -> val += root2 -> val;
root1 -> left = mergeTrees(root1 -> left,root2 -> left);
root1 -> right = mergeTrees(root1 -> right,root2 -> right);
return root1;
}
};
思路: 先通过前序遍历确定根节点,直接改变其中一个二叉树的值即可(相加);之后对两个二叉树的左右子树同时进行遍历,其中若有一个二叉树遍历到空节点,则返回另一个二叉树相同位置的节点(均为空时返回的是空节点)。
小结:这里直接对其中一个二叉树进行了修改,新构造一个二叉树也可以。
LeetCode 700.二叉搜索树中的搜索
题目链接:LeetCode 700. 二叉搜索树中的搜索
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root == NULL || root -> val == val)
return root;
TreeNode* node = NULL;
if(root -> val > val)
node = searchBST(root -> left, val);
if(root -> val < val)
node = searchBST(root -> right, val);
return node;
}
};
思路: 利用二叉搜索树的特性进行搜索(根节点比所有左子树的节点值大,根节点比所有右子树的节点值小)。当搜索到空节点或找到目标值时返回,若根节点的值比目标值大,则在根节点的左子树中继续进行遍历,否则在右子树中进行遍历。最后返回找到的根节点即可。
LeetCode 98.验证二叉搜索树
题目链接:LeetCode 98. 验证二叉搜索树
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root)
{
if(root == NULL)
return;
traversal(root -> left);
vec.push_back(root -> val);
traversal(root -> right);
}
public:
bool isValidBST(TreeNode* root) {
vec.clear();
traversal(root);
for(int i = 1;i < vec.size();i++)
{
if(vec[i] <= vec[i - 1])
return false;
}
return true;
}
};
思路:将二叉树中的值通过中序遍历存入数组中,再判断数组是否有序即可。
小结:
1.在判断时,数组必须是有序数组,数组值不能相同。
2.借助数组来判断的思想比较巧妙。