leetcode刷题之树(2)
生活随笔
收集整理的這篇文章主要介紹了
leetcode刷题之树(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樹的層次遍歷如果用遞歸實現的話,則是深度優先搜索,即先遍歷到最后最后再回溯,然后看根據在每一層上插入同一層的其它數據。過程
class Solution { public: vector<vector<int>>res;vector<vector<int>> levelOrder(TreeNode* root) {helper(root,0);return res;}void helper(TreeNode* root,int lev){if(root==NULL) return;if(res.size()==lev) res.resize(lev+1);res[lev].push_back(root->val);helper(root->left,lev+1);helper(root->right,lev+1);} };如果用迭代的話就需要利用隊進行實現,因為題目要求先進先出,不像二叉樹的遍歷要求存儲樹需要后進先出的特性,所以利用隊列進行實現。
class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>res;queue<TreeNode*>q;TreeNode* p;if(!root)return res;q.push(root);while(!q.empty()){vector<int>tmp;int size=q.size();//每一層的數目for(int i=0;i<size;i++)//一個for循環就是一層{p=q.front();q.pop();tmp.push_back(p->val);if(p->left) q.push(p->left);if(p->right) q.push(p->right);}res.push_back(tmp);}return res;} };有了上道題的鋪墊自然這道題就簡單了,如果沒有做上道題,這道題對于我來說還是有點難度的。
求樹的層次,不需要輸出每一層的值,直接定義一個deep來統計層數就可以了。
代碼如下:
/*** 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:int maxDepth(TreeNode* root) {TreeNode* tmp;queue<TreeNode*>q;int deep=0;if(root==NULL)return 0;q.push(root);while(!q.empty()){deep++;int size=q.size();for(int i=0;i<size;i++){tmp=q.front();q.pop();if(tmp->left) q.push(tmp->left);if(tmp->right) q.push(tmp->right);}}return deep;} };遞歸更簡單兩行代碼解決問題
class Solution { public:int maxDepth(TreeNode* root) {return (root==NULL)?0:max(maxDepth(root->left),maxDepth(root->right))+1;} };以下解法是真的強,而且這道題是好多大廠的面試題
遞歸解法:通過變形的后序遍歷,倒著來,為防止右孩子丟失,先進行保存。代碼如下
class Solution {private: TreeNode* pre; public:void flatten(TreeNode* root) {if(root==NULL)return;flatten(root->right);flatten(root->left);root->right=pre;root->left=NULL;pre=root;} };還有一種方法就是先找到父結點的左孩子的最右孩子,然后將父節點的右孩子接到父結點的左孩子的最右孩子下面,然后將左孩子的左結點插入到右結點之前,重復此過程。
class Solution { public:void flatten(TreeNode* root) {while(root){if(root->left==NULL)root=root->right;else{TreeNode* pre=root->left;while(pre->right!=NULL)pre=pre->right;pre->right=root->right;root->right=root->left;root->left=NULL;root=root->right;}}} };高頻大廠面試題,根據樹的前序遍歷和中序遍歷構造二叉樹。
遞歸實現,我有點笨,理解起來這個有點困難,慢慢的消化吧,以后把其他兩種也寫出來?
/*** 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* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size()==0||inorder.size()==0)return NULL;return build(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);}TreeNode* build(vector<int>& preorder,int ps,int pe,vector<int>& inorder,int is,int ie){//構建根節點TreeNode* root=new TreeNode(preorder[ps]);root->left=NULL;root->right=NULL;//在中序序列中尋找根節點int i=is;while(i<=ie&&preorder[ps]!=inorder[i])++i;//i指向中序序列中根節點的位置int ll=i-is;//左子樹的序列長度int rl=ie-i;//右子樹的序列長度//構建左右子樹 if(ll>0){root->left=build(preorder,ps+1,ps+ll,inorder,is,is+ll-1);}if(rl>0){root->right=build(preorder,ps+ll+1,pe,inorder,is+ll+1,ie);}return root;} };?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的leetcode刷题之树(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言加法结合性,C语言 运算符 的结合
- 下一篇: lstm网络python代码实现