[代码随想录]二叉树篇

文章目录

  • 1. 二叉树之层序遍历
    • 1.1 144-二叉树的前序遍历
    • 1.2 94-二叉树的中序遍历
    • 1.3 145-二叉树的后序遍历
    • 1.4 102-二叉树的层序遍历
    • 1.5 107-二叉树的层序遍历II
    • 1.6 199-二叉树的右视图
    • 1.7* 637-二叉树的层平均值
    • 1.8* 429-N叉树的层序遍历
    • 1.9 515-在每个树行中找最大值
    • 1.10* 116-填充每个节点的下一个右侧节点指针
    • 1.11 117-填充每个节点的下一个右侧节点指针II
    • 1.12 104-二叉树的最大深度
    • 1.13 111-二叉树的最小深度
  • 2. 二叉树之常见算法
    • 2.1 226-翻转二叉树
    • 2.2 101-对称二叉树
    • 2.3* 222-完全二叉树的节点个数
    • 2.4 110-平衡二叉树
    • 2.5 257-二叉树的所有路径
    • 2.6 404-左子叶之和
    • 2.7* 513-找树左下角的值
    • 2.8 112-路径总和
    • 2.9* 106-从中序与后续遍历序列构造二叉树
    • 2.10* 105-从前序与中序遍历序列构造二叉树
    • 2.11* 654-最大二叉树
    • 2.12 617-合并二叉树
    • 2.13* 236-二叉树的最近公共祖先
  • 3. 二叉搜索树
    • 3.1 700-二叉搜索树中的搜索
    • 3.2* 98-验证二叉搜索树
    • 3.3 530-二叉搜索树的最小绝对差
    • 3.4 501-二叉搜索树中的众数
    • 3.5* 235-二叉搜索树的最近公共祖先
    • 3.6* 701-二叉搜索树中的插入操作
    • 3.7* 450-删除二叉搜索树中的节点
    • 3.8* 669-修剪二叉搜索树
    • 3.9 108-将有序数组转换为二叉搜索树
    • 3.10 538-把二叉搜索树转换为累加树

1. 二叉树之层序遍历

1.1 144-二叉树的前序遍历

144
在这里插入图片描述

/*** 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:void Recursion(TreeNode* root,vector<int>& ans){if(root == nullptr)return;ans.push_back(root->val);Recursion(root->left,ans);Recursion(root->right,ans);}vector<int> preorderTraversal(TreeNode* root) {vector<int> ans;Recursion(root,ans);return ans;}
};

迭代难度更大

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> st;TreeNode* cur = root;while(cur || !st.empty()){while(cur) //第一趟把左列节点放入栈和ans{ans.push_back(cur->val);st.push(cur);cur = cur->left;}TreeNode* tmp = st.top(); //对应着左下角的节点st.pop();cur = tmp->right; //开始右}return ans;}
};

1.2 94-二叉树的中序遍历

94
在这里插入图片描述

class Solution {
public:void Recursion(TreeNode* root,vector<int>& ans){if(root == nullptr)return;Recursion(root->left,ans);ans.push_back(root->val);Recursion(root->right,ans);}vector<int> inorderTraversal(TreeNode* root) {vector<int> ans;Recursion(root,ans);return ans;}
};

迭代法

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> ans;TreeNode* cur = root;while(cur || !st.empty()){while(cur){//ans.push_back(cur->val); 并不是最左边的数据放在第一个st.push(cur);cur = cur->left;}TreeNode* tmp = st.top();ans.push_back(tmp->val); st.pop();cur = tmp->right;}}
};

1.3 145-二叉树的后序遍历

145

在这里插入图片描述

class Solution 
{
public:void Recursion(TreeNode*& root,vector<int>& ans){if(root==nullptr)return;Recursion(root->left,ans);Recursion(root->right,ans);ans.push_back(root->val);}vector<int> postorderTraversal(TreeNode* root) {vector<int> ans;Recursion(root,ans);return ans;}
};

迭代法

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> st;TreeNode* cur = root;TreeNode* prev = nullptr;while(cur || !st.empty()){while(cur){st.push(cur);cur=cur->left;}TreeNode* top = s.top();if(!top->right || top->right == prev){ans.push_back(top->val);prev = top;st.pop();}elsecur = top->right; //当左走完之后这一步可以走到右}return ans;}
};

1.4 102-二叉树的层序遍历

102

在这里插入图片描述

class Solution {
public:void Recursion(vector<vector<int>>& ans,TreeNode* root,int level){if(!root)return;if(ans.size() <= level) //ans的层数不够,加层数ans.push_back(vector<int>());ans[level].push_back(root->val);Recursion(ans,root->left,level+1);Recursion(ans,root->right,level+1);}vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ans;Recursion(ans,root,0);return ans;}
};

1.5 107-二叉树的层序遍历II

107

在这里插入图片描述

上一题reverse一下就可以了

class Solution {
public:void Recursion(vector<vector<int>>& ans,TreeNode* root,int level){if(!root)return;if(ans.size() <= level)ans.push_back(vector<int>());ans[level].push_back(root->val);Recursion(ans,root->left,level+1);Recursion(ans,root->right,level+1);}vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> ans;Recursion(ans,root,0);reverse(ans.begin(),ans.end());return ans;}
};

也引入一下这题(上一题)的非递归写法

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root); //先放一个根节点vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();vec.push_back(node->val); //从前往后一个一个取if (node->left) que.push(node->left); //push进去当前层的下一层节点if (node->right) que.push(node->right); //同理}result.push_back(vec); //加入一层}reverse(result.begin(), result.end()); // 在这里反转一下数组即可return result;}
};

1.6 199-二叉树的右视图

199
在这里插入图片描述

class Solution {
public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> que;vector<int> ans;if(root) //加入第一个节点que.push(root);while(!que.empty()){int size = que.size();for(int i = 0; i < size;i++){TreeNode* tmp = que.front();que.pop();if(i == (size-1)) //如果是位于尾部ans.push_back(tmp->val);if(tmp->left)que.push(tmp->left);//加入下一层数据if(tmp->right)que.push(tmp->right);}}return ans;}
};

1.7* 637-二叉树的层平均值

637

在这里插入图片描述

class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {queue<TreeNode*> que;vector<double> ans;if(root)que.push(root);while(!que.empty()){int size = que.size();double sum = 0;for(int i = 0; i < size; ++i){TreeNode* tmp = que.front();que.pop();sum+=tmp->val;if(tmp->left)que.push(tmp->left);if(tmp->right)que.push(tmp->right);}ans.push_back(sum/size);}return ans;}
};

1.8* 429-N叉树的层序遍历

429

在这里插入图片描述
在这里插入图片描述

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;vector<vector<int>> ans;if(root)que.push(root);while(!que.empty()){int size = que.size();vector<int> tmp_v;for(int i = 0; i < size; ++i){Node* node = que.front();que.pop();tmp_v.push_back(node->val);for(int j = 0; j < node->children.size(); ++j) //下一层节点加入queif(node->children[j])que.push(node->children[j]);}ans.push_back(tmp_v);}return ans;}
};

1.9 515-在每个树行中找最大值

515

在这里插入图片描述

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ans;queue<TreeNode*> que;if(root)que.push(root);while(!que.empty()){int size = que.size();int max = INT_MIN;for(int i = 0; i < size;++i){TreeNode* tmp = que.front();que.pop();if(tmp->val>max)max = tmp->val;if(tmp->left)que.push(tmp->left);if(tmp->right)que.push(tmp->right);}ans.push_back(max);}return ans;}
};

1.10* 116-填充每个节点的下一个右侧节点指针

116

在这里插入图片描述

在这里插入图片描述

/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _right, Node* _next): val(_val), left(_left), right(_right), next(_next) {}
};
*/class Solution {
public:Node* connect(Node* root) {if(!root)return nullptr;Node* leftest = root;while(leftest->left) //如果该节点还有子节点,则说明可以进入循环处理其孩子{Node* cur = leftest;while(cur) //处理cur所有的子节点连接 {cur->left->next = cur->right; //下一层的next连接if(cur->next)cur->right->next = cur->next->left; //下一层隔支连接cur = cur->next;}leftest = leftest->left; //下一层最左边开始}return root;}
};

若使用普通的层序遍历那么空间复杂度会达到N
而这种方式空间复杂度为1


1.11 117-填充每个节点的下一个右侧节点指针II

117

在这里插入图片描述
在这里插入图片描述

上一题是完全二叉树

/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _right, Node* _next): val(_val), left(_left), right(_right), next(_next) {}
};
*/class Solution {
public:Node* connect(Node* root) {if(root && (root->left || root->right)) //root存在并且必须有一个孩子{if(root->left && root->right) //如果有左有右,则连接孩子root->left->next = root->right;//准备让孩子隔支连接Node* child = root->right ? root->right : root->left;Node* brodady = root->next; //向右移动以便用孩子连接childwhile(brodady && !(brodady->left||brodady->right)) //直到brodady走到尽头,也要找到有孩子的brodadybrodady = brodady->next;child->next = brodady ? (brodady->left ? brodady->left : brodady->right) : nullptr;connect(root->right); //先向右初始化出NULLconnect(root->left);}return root;}
};

1.12 104-二叉树的最大深度

104

在这里插入图片描述

class Solution {
public:int maxDepth(TreeNode* root) {if(!root)return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

1.13 111-二叉树的最小深度

111
在这里插入图片描述

class Solution {
public:int minDepth(TreeNode* root) {if(!root)return 0;if(!root->left && !root->right)return 1;int min_depth = INT_MAX;if(root->left)min_depth = min(minDepth(root->left),min_depth);if(root->right)min_depth = min(minDepth(root->right),min_depth);return min_depth+1;}
};

2. 二叉树之常见算法

2.1 226-翻转二叉树

226
在这里插入图片描述

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(!root)return nullptr;swap(root->left,root->right);invertTree(root->left);invertTree(root->right);return root;}
};

2.2 101-对称二叉树

101

在这里插入图片描述
在这里插入图片描述

递归

class Solution {
public:bool Recursion(TreeNode* left,TreeNode* right){if(!left&&right || left&&!right) //如果长短不一return false;if(!left && !right) //如果都没有后续了return true;if(left->val != right->val)return false;return Recursion(left->left,right->right) &&Recursion(left->right,right->left); //对称的两个节点比较}bool isSymmetric(TreeNode* root) {return Recursion(root->left,root->right);}
};

迭代(栈)

class Solution {
public:bool isSymmetric(TreeNode* root) {stack<TreeNode*> st;st.push(root->left);st.push(root->right);while (!st.empty()) {TreeNode* leftNode = st.top(); st.pop();TreeNode* rightNode = st.top(); st.pop();if (!leftNode && !rightNode) //左右节点都不存在,相当于对称,循环至下一次判断continue;//左右不一样长 || 左右节点的值不一样if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) return false;st.push(leftNode->left);st.push(rightNode->right);st.push(leftNode->right);st.push(rightNode->left);}return true;}
};

2.3* 222-完全二叉树的节点个数

222

在这里插入图片描述
在这里插入图片描述

递归遍历 O(N)

class Solution {
public:void Recursion(TreeNode* root,int& count){if(!root)return;count++;Recursion(root->left,count);Recursion(root->right,count);}int countNodes(TreeNode* root) {int count = 0;Recursion(root,count);return count;}
};

精简版递归

class Solution {
public:int countNodes(TreeNode* root) {if (root == NULL) return 0;return 1 + countNodes(root->left) + countNodes(root->right);}
};

最优

class Solution {
public:int countNodes(TreeNode* root) {if (!root)return 0;int level = 0;TreeNode* cur = root;while (cur->left) {level++;cur = cur->left;}int low = 1 << level; // 层序遍历第low位为最深层最左侧节点序号 4int high = (1 << (level + 1)) - 1; //层序遍历第high位为最深层最右侧节点序号 7while (low < high) {int mid = (high - low + 1) / 2 + low; //+1防止low+0 ,mid为两节点中间部分一个节点,偏右if (exists(root, level, mid))low = mid;elsehigh = mid - 1;}return low;}bool exists(TreeNode* root, int level, int mid) //6{int bits = 1 << (level - 1); //上一层的第一位序列TreeNode* cur = root;while (cur && bits > 0) {if (bits & mid)  //0010 0110 0010 当不再同一树时判断后就进入循环cur = cur->right;elsecur = cur->left;bits >>= 1; //bits是最左节点,往上靠}return cur != nullptr;}
};

时间复杂度:O(logN*logN)
空间复杂度:O(1)


2.4 110-平衡二叉树

110
在这里插入图片描述
在这里插入图片描述

class Solution {
public:int Recursion(TreeNode* root){if(!root)return 0;int left = Recursion(root->left);if(left == -1)return -1;int right = Recursion(root->right);if(right == -1)return -1;if(abs(left-right) > 1)return -1; //执行后,以后的结果都为-1,递归其实已经可以看作结束了return left>right?left+1:right+1; //每一层都会记录层数+1}bool isBalanced(TreeNode* root) {if(Recursion(root) == -1)return false;return true;   }
};

2.5 257-二叉树的所有路径

257
在这里插入图片描述
在这里插入图片描述

class Solution {
public:void Recursion(TreeNode* root,vector<string>& vs,string s) //s传的是临时拷贝份{if(root&&!root->left&&!root->right) //无子,此时不加->{s+=(to_string(root->val));vs.push_back(s);return;}if(!root)return;s+=(to_string(root->val)+"->");Recursion(root->left,vs,s); Recursion(root->right,vs,s); }vector<string> binaryTreePaths(TreeNode* root) {vector<string> vs;string s;Recursion(root,vs,s);return vs;}
};

2.6 404-左子叶之和

404
在这里插入图片描述

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (!root) return 0;int leftValue = 0;if (root->left && !root->left->left && !root->left->right) //左子存在且为叶leftValue = root->left->val;return leftValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);}
};

2.7* 513-找树左下角的值

513

在这里插入图片描述
在这里插入图片描述

dfs

class Solution {
public:void Recursion(TreeNode* cur,int curdep,int& maxdep,int& ans){if(!cur->left&&!cur->right){if(curdep>maxdep){maxdep = dep;ans = cur->val;}return;}if(cur->left) //cur->left在前面使得更早的占用ans,以防被right占用Recursion(cur->left,dep+1,maxdep,ans);if(cur->right)Recursion(cur->right,dep+1,maxdep,ans);}int findBottomLeftValue(TreeNode* root) {int ans = root->val;int maxdep = 0;Recursion(root,0,maxdep,ans);return ans;}
};

bfs

class Solution {
public:int findBottomLeftValue(TreeNode* root) {int ans = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()){TreeNode* cur = que.front();que.pop();if(cur->right)que.push(cur->right);if(cur->left)que.push(cur->left);ans = cur->val;}return ans;}
};

2.8 112-路径总和

112

在这里插入图片描述
在这里插入图片描述

class Solution {
public:bool Recursion(TreeNode* cur,int sum,int target){if(!cur)return false;if(!cur->left&&!cur->right&&sum+cur->val == target)return true;return Recursion(cur->left,sum+cur->val,target)||Recursion(cur->right,sum+cur->val,target);}bool hasPathSum(TreeNode* root, int targetSum) {return Recursion(root,0,targetSum);}
};

2.9* 106-从中序与后续遍历序列构造二叉树

106

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* Recursion(vector<int>& inorder,vector<int>& postorder,int& rootindex,int left,int right){if(left > right)return nullptr;TreeNode* cur = new TreeNode(postorder[rootindex]); //cur为当前根节点int mid = 0;for(mid = inorder.size()-1 ; mid >=0 ; --mid)if(inorder[mid] == postorder[rootindex])break;//此时mid为inorder的根坐标rootindex--; //跳到下一个根//因为是后序所以先right,否则会出现构建出相反的树,并且大概率导致rootindex<0而导致的越栈cur->right = Recursion(inorder,postorder,rootindex,mid+1,right);cur->left = Recursion(inorder,postorder,rootindex,left,mid-1);return cur;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int rootindex = postorder.size() - 1;return Recursion(inorder,postorder,rootindex,0,rootindex);}
};

2.10* 105-从前序与中序遍历序列构造二叉树

105
在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* Recursion(vector<int>& preorder, vector<int>& inorder,int& rootindex,int left , int right){if(left > right)return nullptr;TreeNode* cur = new TreeNode(preorder[rootindex]);int mid = 0;for(mid = 0 ; mid < inorder.size() ; ++mid)if(inorder[mid] == preorder[rootindex])break;rootindex++;cur->left = Recursion(preorder,inorder,rootindex,left,mid-1);cur->right = Recursion(preorder,inorder,rootindex,mid+1,right);return cur;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int rootindex = 0;return Recursion(preorder,inorder,rootindex,0,preorder.size()-1);}
};

2.11* 654-最大二叉树

654

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* Recursion(vector<int>& nums,int left,int right){if(left > right)return nullptr;int mid = left; //坐标int max = 0;    //最大值for(int i = mid ; i <= right ; ++i){if(nums[i] > max){mid = i;       //mid就是根的坐标max = nums[i]; //最大值就是根}}TreeNode* cur = new TreeNode(max); //构建根cur->left = Recursion(nums,left,mid-1);cur->right = Recursion(nums,mid+1,right);return cur;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return Recursion(nums,0,nums.size()-1);}
};

2.12 617-合并二叉树

617

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(!root1)return root2; //如果两个节点都不存在,也会返回nullptr(root2)if(!root2)return root1;TreeNode* root = new TreeNode(root1->val+root2->val);root->left = mergeTrees(root1->left,root2->left);root->right = mergeTrees(root1->right,root2->right);return root;}
};

2.13* 236-二叉树的最近公共祖先

236

在这里插入图片描述

在这里插入图片描述

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(!root)return nullptr;if(root == p || root == q)return root;TreeNode* left = lowestCommonAncestor(root->left,p,q);TreeNode* right = lowestCommonAncestor(root->right,p,q);if(left&&right)return root;else if(!left&&right)return right;else if(left&&!right)return left;elsereturn nullptr;}
};

3. 二叉搜索树

3.1 700-二叉搜索树中的搜索

700

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if(!root)return nullptr;if(val < root->val)return searchBST(root->left,val);else if(val > root->val)return searchBST(root->right,val);elsereturn root;}
};

3.2* 98-验证二叉搜索树

98

在这里插入图片描述
在这里插入图片描述

class Solution {
public:bool isValidBST(TreeNode* root,TreeNode* minNode = nullptr,TreeNode* maxNode = nullptr) {if(!root)return true;if((minNode && root->val <= minNode->val) || //右树用来判断是否比父小(maxNode && root->val >= maxNode->val))  //左树用来判断是否比父大return false;                            //不符合就falsereturn isValidBST(root->left,minNode,root) && //对于左树,最大的就是根isValidBST(root->right,root,maxNode); //对于右树,最小的就是根}
};

更直观的方法

class Solution {
public:bool isValidBST(TreeNode* root) {if(!root)return true;if(root->left){TreeNode* tmp = root->left;if(tmp->val>=root->val) //先判断和父的关系是否满足return false;while(tmp->right)       //在判断自己的右孩子是否和自己对应{                       //左孩子会通过递归(和父的关系)进行判断tmp = tmp->right;if(tmp->val>=root->val)return false;}}if(root->right){TreeNode* tmp = root->right;if(tmp->val<=root->val)return false;while(tmp->left){tmp = tmp->left;if(tmp->val<=root->val)return false;}}return isValidBST(root->left) && isValidBST(root->right);}
};

3.3 530-二叉搜索树的最小绝对差

530

在这里插入图片描述
在这里插入图片描述

递归

class Solution {
public:void Recursion(TreeNode* root,TreeNode*& prev,int& mindif){if(!root)return;Recursion(root->left,prev,mindif);if(prev)mindif = min(mindif,abs(root->val-prev->val));prev = root; //prev就是更深层的Recursion(root->right,prev,mindif);}int getMinimumDifference(TreeNode* root) {int mindif = INT_MAX;TreeNode* prev = nullptr;Recursion(root,prev,mindif); //类似于采取中序遍历寻找mindifreturn mindif;}
};

完全遍历

class Solution {
public:void Recursion(TreeNode* root,int& min){if(!root)return;int tmp;if(root->left){TreeNode* left = root->left;while(left){tmp =abs(root->val-left->val);if(tmp<min)min = tmp;left = left->right;}}if(root->right){TreeNode* right = root->right;while(right){tmp = abs(root->val-right->val);if(tmp<min)min = tmp;right = right->left;}}Recursion(root->left,min);Recursion(root->right,min);}int getMinimumDifference(TreeNode* root) {int min = 100000;Recursion(root,min);return min;}
};

3.4 501-二叉搜索树中的众数

501

在这里插入图片描述
在这里插入图片描述

hash通解,即非二叉树也可解

class Solution {
public:void Init_um_Recursion(TreeNode* root,unordered_map<int,int>& um){if(!root)return;um[root->val]++;Init_um_Recursion(root->left,um);Init_um_Recursion(root->right,um);}vector<int> findMode(TreeNode* root) {unordered_map<int,int> um;Init_um_Recursion(root,um);vector<int> ans;int max = INT_MIN;for(auto& e : um) //算出最多的出现次数if(e.second > max)max = e.second;for(auto& e : um)if(e.second == max)ans.push_back(e.first);return ans;}
};

针对

/*** 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:int samenum = 0;int count = 0;int maxcount = 0;void Get_ret(TreeNode* root,vector<int>& ret){if(!root)return;Get_ret(root->left,ret);ret.push_back(root->val);if(samenum == root->val) //即使samenum初始值就和val相同也无所谓count++;else{samenum = root->val;count=1; //避免samenum初始就和val相同而导致的错误计数,也方便使用}if(maxcount < count)maxcount = count;Get_ret(root->right,ret);}vector<int> findMode(TreeNode* root) {vector<int> ans;vector<int> ret;Get_ret(root,ret);int left = 0;int right = maxcount-1; //left到right 可看作是窗口while(right < ret.size()){if(ret[left] == ret[right]){ans.push_back(ret[left]);left = right+1;right = left+maxcount-1;}else{left++;right++;}}return ans;}
};

3.5* 235-二叉搜索树的最近公共祖先

235

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(!root)return nullptr;if(root->val > p->val && root->val > q->val) //都在根右边return lowestCommonAncestor(root->left,p,q);else if(root->val<p->val&&root->val<q->val)return lowestCommonAncestor(root->right,p,q);return root;}
};

3.6* 701-二叉搜索树中的插入操作

701

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(!root)return new TreeNode(val);if(val > root->val)root->right = insertIntoBST(root->right,val);else if(val < root->val)root->left = insertIntoBST(root->left,val);return root;}
};

3.7* 450-删除二叉搜索树中的节点

450

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* findMin(TreeNode* node) {while (node->left) node = node->left;return node;}TreeNode* deleteNode(TreeNode* root, int key) {if (!root) return root;if (key < root->val) root->left = deleteNode(root->left, key);else if (key > root->val) root->right = deleteNode(root->right, key);else {if (!root->left) {TreeNode* temp = root->right;delete root;return temp;}else if (!root->right) {TreeNode* temp = root->left;delete root;return temp;}TreeNode* temp = findMin(root->right); //temp就是要替代的节点root->val = temp->val;root->right = deleteNode(root->right, temp->val);}return root;}
};

3.8* 669-修剪二叉搜索树

669

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(!root)return nullptr; //间接删除if(root->val<low) //范围全在右子树上return trimBST(root->right,low,high);if(root->val>high)return trimBST(root->left,low,high);root->left = trimBST(root->left,low,high);root->right = trimBST(root->right,low,high);return root;}
};

3.9 108-将有序数组转换为二叉搜索树

108

在这里插入图片描述
在这里插入图片描述

class Solution {
public:TreeNode* Recursion(vector<int>& nums,int left,int right){if(left>right)return nullptr;int mid = left+((right-left)>>1); // >>1 可看作是 /2,默认左偏TreeNode* newnode = new TreeNode(nums[mid]);newnode->left = Recursion(nums,left,mid-1);newnode->right = Recursion(nums,mid+1,right);return newnode;}TreeNode* sortedArrayToBST(vector<int>& nums) {return Recursion(nums,0,nums.size()-1);}
};

3.10 538-把二叉搜索树转换为累加树

538

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:void Recursion(TreeNode* root,int& val){if(!root)return;Recursion(root->right,val);val+=root->val;root->val = val;Recursion(root->left,val);}TreeNode* convertBST(TreeNode* root) {int val = 0;Recursion(root,val);return root;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s修改集群IP--重置集群

原来IP地址 192.168.10.138 k8s-master 192.168.10.139 k8s-node1 192.168.10.140 k8s-node2 新IP地址 192.168.10.148 k8s-master 192.168.10.149 k8s-node1 192.168.10.150 k8s-node2 cp -Rf /etc/kubernetes/ /etc/kubernetes-bak pki 证书目录保留下来&#xff1a; rm -rf …

Ubuntu18.04下载安装基于使用QT的pcl1.13+vtk8.2,以及卸载

一、QVTKWidget、QVTKWidget2、QVTKOpenGLWidget、QVTKOpenGLNativeWidget 区别 1.Qt版本 Qt5.4以前版本&#xff1a;QVTKWidget2/QVTKWidget。 Qt5.4以后版本&#xff1a;QVTKOpenGLWidget/QVTKOpenGLWidget。 2.VTK版本(Qt版本为5.4之后) 在VTK8.2以前的版本&#xff1a;QVT…

Springboot——集成jodconverter做文档转换

文章目录 前言jodconverter 简介下载安装 libreoffice代码演示1、创建springboot项目工程并引入依赖2、配置3、准备一个docx模板4、编写测试代码 运行后的样式linux 环境下安装 libreoffice 前言 公司项目开发中&#xff0c;早期使用docx4j进行word转pdf&#xff0c;出现了很多…

网络安全工程师最详细学习和职业规划路线(书籍推荐和导图下载)

网络安全行业热火朝天&#xff0c;但我们很少看到这个领域相关职业路线的规划&#xff0c;这一方面是由于这个行业还比较年轻&#xff0c;还没有完全建立职业路径&#xff0c;另一方面也是因为高端职位以前比较少&#xff0c;很少有人到达顶峰&#xff0c;所以难以总结。 但随…

计算机毕业设计 it职业生涯规划系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

动手学强化学习第2章多臂老虎机

2.1简介 多臂老虎机问题可以被看作简化版的强化学习问题。但是其只有动作和奖励没有状态信息&#xff0c;算是简化版的强化学习问题。 2.2问题介绍 2.2.1问题定义 在多臂老虎机(MAB)问题中&#xff0c;有一个有K根拉杆的老虎机&#xff0c;拉动每一根拉杆都对应一个关于奖励…

在 centos7 上安装Docker

1、检查linux内核 Docker 运行在 CentOS 7 上&#xff0c;要求系统为64位、系统内核版本为 3.10 以上。 Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上&#xff0c;要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。 uname -r 2、使用 root 权限登录 Centos…

docker应用记录总结

一、前言 docker这类部署工具&#xff0c;久而久之不使用非常容易忘记&#xff0c;甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结&#xff0c;纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…

踩雷react-useRef钩子函数

今天测试提了一个bug&#xff0c;之前做的有个需求&#xff0c;在触发事件发起请求后&#xff0c;成功响应返回的新的数据没有第一时间渲染到网页上。 方法也都成功更新了数据&#xff0c;就是渲染会慢1-2分钟&#xff0c;排错排了老半天&#xff0c;最后找到了原因。 一般情…

SpringBoot和Hibernate——如何提高数据库性能

摘要&#xff1a;本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在软件开发领域&#xff0c;性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…

单目标应用:遗传算法(Genetic Algorithm,GA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、遗传算法GA 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索…

【Java 进阶篇】JavaScript 数据类型详解

JavaScript是一种弱类型脚本语言&#xff0c;具有动态类型。这意味着JavaScript中的变量可以容纳不同类型的数据&#xff0c;并且它们的类型可以在运行时更改。在本文中&#xff0c;我们将深入探讨JavaScript中的数据类型&#xff0c;包括原始数据类型和引用数据类型&#xff0…

安科瑞ARB5系列弧光保护装置,智能电弧光保护,保障用电安全

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 什么是弧光 电弧是放电过程中发生的一种现象&#xff0c;当两点之间的电压超过其工频绝缘强度极限时就会发生。当适当的条件出现时&#xff0c;一个携带着电流的等离子产生&#xff0c;直到电源侧的保护设备断开才会消失。空气在通常条件…

【ARM CoreLink 系列 6 -- DMC-400控制器简介】

文章目录 1.1 DMC-400 简介1.1.1 DFI&#xff08;DDR PHY Interface&#xff09;1.1.2 DFI 接口组1.1.3 DMC-400 兼容协议1.1.4 DMC-400 特性1.1.5 DMC-400 Interface 1.1 DMC-400 简介 DMC-400是一个由ARM开发、测试和授权的动态内存控制器&#xff0c;同时 DMC-400也是一个符…

git 回滚到指定版本

第一步&#xff1a;找到指定的需要回滚的版本的版本号 项目终端输入命令git log --oneline 第二步&#xff1a;使用git命令回滚到指定的版本 git reset --hard 版本号 第三步&#xff1a;此时再推到远程仓库用git push 会报错&#xff0c;需要用git push -f强推上去才可以哦

Swagger-go学习笔记

目录 Swagger的作用背景Swagger介绍 Swagger的基本使用1. 使用步骤2. 添加注释3. 生成接口文档数据4. 引入gin-swagger5. 测试结果6. 使用Token Swagger-go的中文文档通用API信息API操作MIME类型参数类型数据类型 Swagger的作用 背景 在传统的前后端分离的项目中&#xff0c;…

vue3组件的通信方式

一、vue3组件通信方式 通信仓库地址:vue3_communication: 当前仓库为贾成豪老师使用组件通信案例 不管是vue2还是vue3,组件通信方式很重要,不管是项目还是面试都是经常用到的知识点。 比如:vue2组件通信方式 props:可以实现父子组件、子父组件、甚至兄弟组件通信 自定义事件:可…

C语言自定义类型_枚举联合(3)

目录 枚举 什么是枚举类型&#xff1f; 枚举的声明 枚举的定义 枚举的优点 枚举的使用 联合&#xff08;共用体&#xff09; 什么是联合呢&#xff1f; 联合类型的定义 联合的特点 联合使用 联合大小的计算 联合的应用 今天接着我们来结束自定义类型。&#x1f19…

Flink之Watermark源码解析

1. WaterMark源码分析 在Flink官网中介绍watermark和数据是异步处理的,通过分析源码得知这个说法不够准确或者说不够详细,这个异步处理要分为两种情况: watermark源头watermark下游 这两种情况的处理方式并不相同,在watermark的源头确实是异步处理的,但是在下游只是做的判断,这…

TensorFlow学习:在web前端如何使用Keras 模型

前言 在上篇文章 TensorFlow学习&#xff1a;使用官方模型进行图像分类、使用自己的数据对模型进行微调中我们学习了如何使用官方模型&#xff0c;以及使用自己的数据微调模型。 但是吧&#xff0c;代码一直是跑在Python里&#xff0c;而我本身是做前端开发的。我是很想让它在…