1、LeetCode654 最大二叉树
题目链接:654、最大二叉树
先要找到数组中最大的值和对应的下标, 最大的值构造根节点。
最大值所在的下标左区间 构造左子树,最大值所在的下标右区间 构造右子树。
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right)
{
if (left >= right) return NULL;
int maxValueIndex = left;
for (int i = left; i < right; i++)
{
if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;
}
TreeNode * root = new TreeNode(nums[maxValueIndex]);
root->left = traversal(nums, left, maxValueIndex);
root->right = traversal(nums, maxValueIndex + 1, right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};
2、LeetCode617 合并二叉树
题目链接:617、合并二叉树
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
// 修改了t1的数值和结构
t1->val += t2->val; // 中
t1->left = mergeTrees(t1->left, t2->left); // 左
t1->right = mergeTrees(t1->right, t2->right); // 右
return t1;
}
};
3、LeetCode700 二叉搜索树中的搜索
题目链接:700、二叉搜索树中的搜索
终止条件:当搜索的节点为空或等于需要的值时,return root。
当前搜索的节点值大于目标值,向左搜寻,否则向右搜寻。
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;
}
};
4、LeetCode98 验证二叉搜索树
题目链接:98、验证二叉搜索树
方法一:递归中序遍历将二叉搜索树转变成一个数组
class Solution {
public:
vector<int> vec;
void traversal(TreeNode* root)
{
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
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;
}
};
方法二:long long maxVal = LONG_MIN; 每次用maxValue去比较。
class Solution {
public:
long long maxValue = LONG_MIN;
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);
if (maxValue < root->val)
{
maxValue = root->val;
}
else
{
return false;
}
bool right = isValidBST(root->right);
bool result = left && right;
return result;
}
};
方法三:记录前一个节点来比较,相当于双指针。
class Solution {
public:
TreeNode* pre = NULL;
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);
if (pre!= NULL && pre->val >= root->val) return false;
pre= root;
bool right = isValidBST(root->right);
bool result = left && right;
return result;
}
};