654.最大二叉树
思路:前序遍历,分割左右子树注意区间,下面是左闭右开。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* traversal(vector<int>& nums,int left,int right){
if(left>=right)
return NULL;
int max=left;
for(int i=left;i<right;++i){
if(nums[max]<nums[i])
max=i;
}
TreeNode* node=new TreeNode(nums[max]);
int leftbegin=left;
int leftend=max;
int rightbegin=max+1;
int rightend=right;
node->left=traversal(nums,leftbegin,leftend);
node->right=traversal(nums,rightbegin,rightend);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums,0,nums.size());
}
};
617.合并二叉树
思路:构造二叉树都使用前序遍历,两棵树同时遍历,返回值为结点指针。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1) return root2;
if(!root2) return root1;
root1->val+=root2->val;
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};
700.二叉搜索树中的搜索
思路:利用二叉搜索树的性质进行查找,定义一个结点来储存返回值
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(!root||root->val==val)
return root;
TreeNode* res=NULL;
if(root->val>val) res=searchBST(root->left,val);
if(root->val<val) res=searchBST(root->right,val);
return res;
}
};
98.验证二叉搜索树
思路:利用二叉搜索树的中序遍历为有序数组,通过定义一个前置结点来判断是否有序
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
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);
return left&&right;
}
};