以下是今日份的总结
654 最大二叉树
617 合并二叉树
700 二叉搜索树中的搜索
98 验证二叉搜索树
654 构造二叉树,基本思路为切割数组,然后再做具体判断
617 想复杂了,就是简单的遍历、赋值即可
700 想复杂了,二叉搜索树左小右大
98 想复杂了,中序遍历判断线索二叉树
今天的题目难度不低,但是也不难想,跟着随想录码一遍很容易就会了 ^ _ ^
最大二叉树
思路:
找到数组中最大值,切割左子数组和右子数组
值得注意的是
采用前序遍历的办法,先插入根节点,然后递归左右
递归
TreeNode* buildTree(vector<int>& nums) {
if (nums.size() == 0)
return NULL;
// 1.查找当前数组最大值
int maxPos = 0, maxValue = INT_MIN;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > maxValue)
maxPos = i; // 判断最大值位置
maxValue = max(maxValue, nums[i]); // 获取当前最大值
}
// 创建根节点
TreeNode* root = new TreeNode(maxValue);
// 2.分割左右字数组,区间左闭右开
vector<int> leftNums(nums.begin(), nums.begin() + maxPos);
vector<int> rightNums(nums.begin() + maxPos + 1, nums.end());
// 3.递归
root->left = buildTree(leftNums);
root->right = buildTree(rightNums);
// 4.返回
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return buildTree(nums);
}
合并二叉树
思路:
遍历单个二叉树,将两一棵树的值加上就行
值得注意的是
判断当前位置哪个有值用哪个节点
递归
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
//判空
if(root1==NULL) return root2;
if(root2==NULL) return root1;
//先序遍历
//2.合并节点值
root1->val += root2->val;
//3.递归
root1->left = mergeTrees(root1->left,root2->left);
root1->right = mergeTrees(root1->right,root2->right);
//返回
return root1;
}
二叉搜索树中的搜索
思路:
根据BST判断遍历顺序
值得注意的是
若BST的左子树不为空,则左子树上所有节点的值都小于根节点的值
若BST的右子树不为空,则右子树上所有节点的值都大于根节点的值
BST的左右子树也分别为二叉搜索树
递归
TreeNode* searchBST(TreeNode* root, int val) {
//判空
if (root == NULL || 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;
}
验证二叉搜索树
思路:
中序遍历BST,节点值时按从小到大的顺序排列
值得注意的是
BST中不存在相同的值
递归
void Order(TreeNode* root,vector<int>&vec){
if(root == NULL) return;
Order(root->left, vec);
vec.push_back(root->val);
Order(root->right, vec);
}
bool isValidBST(TreeNode* root) {
//判空
if(root->left==NULL&&root->right==NULL)return true;
vector<int>cur;
//中序遍历
Order(root,cur);
//二叉搜索树中不存在value相等的元素
for(int i = 1;i<cur.size();i++){
if(cur[i]<=cur[i-1])return false;
}
return true;
}
同样是递归
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;
}
写在最后
----OK,今日份的博客就写到这里,这一期的题不轻松啊,明天继续加油!!!
—看了看下期的题,二叉树就没轻松的;
–追上时间进度了吗?如追,从欠四天变成欠三天!!(笑
-去建造世界上唯一的堡垒,走廊上有很多书架,透过阳光能看到你。