数据结构与算法——二叉树与图
文章目錄
- 1.預(yù)備知識
- 1.1 二叉樹定義
- 1.2 二叉樹的構(gòu)造
- 2.路徑總和 II
- 2.1 題目描述
- 2.2 算法思路
- 2.3 C++實(shí)現(xiàn)
- 3.二叉樹的最近公共祖先
- 3.1 題目描述
- 3.2 解題思路
- 3.3 C++實(shí)現(xiàn)
- 4.二叉樹展開為鏈表
- 4.1 題目描述
- 4.2 思考
- 4.3 C++實(shí)現(xiàn)
- 4.4 解法二
- 4.5 C++實(shí)現(xiàn)
- 5.二叉樹的右視圖
- 5.1 預(yù)備知識
- 5.2 題目描述
- 5.3 解題思路
- 5.4 C++實(shí)現(xiàn)
- 6. 課程表
- 6.1 預(yù)備知識
- 6.1.1 什么是圖?
- 6.1.2 圖的表示
- 6.1.3 圖的深度優(yōu)先遍歷
- 6.1.4 圖的寬度優(yōu)先遍歷
- 6.2 題目描述
- 6.3 分析
- 6.4 C++代碼實(shí)現(xiàn)
1.預(yù)備知識
1.1 二叉樹定義
1.2 二叉樹的構(gòu)造
2.路徑總和 II
2.1 題目描述
給你二叉樹的根節(jié)點(diǎn) root 和一個(gè)整數(shù)目標(biāo)和 targetSum ,找出所有 從根節(jié)點(diǎn)到葉子節(jié)點(diǎn) 路徑總和等于給定目標(biāo)和的路徑。
葉子節(jié)點(diǎn) 是指沒有子節(jié)點(diǎn)的節(jié)點(diǎn)。
2.2 算法思路
2.3 C++實(shí)現(xiàn)
/*** 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:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int>> result;vector<int> path;int path_value=0;preorder(root,path_value,targetSum,path,result);return result;} private:void preorder(TreeNode* Node,int &path_value,int sum,vector<int> &path,vector<vector<int>> &result){if(!Node){return;}path_value+=Node->val;path.push_back(Node->val);if(path_value==sum&&Node->left==nullptr&&Node->right==nullptr){result.push_back(path);}preorder(Node->left,path_value,sum,path,result);preorder(Node->right,path_value,sum,path,result);path_value-=Node->val;path.pop_back();} };3.二叉樹的最近公共祖先
3.1 題目描述
給定一個(gè)二叉樹, 找到該樹中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先。
百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個(gè)節(jié)點(diǎn) p、q,最近公共祖先表示為一個(gè)節(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)。”
3.2 解題思路
3.3 C++實(shí)現(xiàn)
/*** 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) {vector<TreeNode*> path;vector<TreeNode*> node_p_path;vector<TreeNode*> node_q_path;int finish=0;preorder(root,p,path,node_p_path,finish);path.clear();finish=0;preorder(root,q,path,node_q_path,finish);int path_length=0;if(node_p_path.size()<node_q_path.size()){path_length=node_p_path.size();}else{path_length=node_q_path.size();}TreeNode* result=0;for(int i=0;i<path_length;i++){if(node_p_path[i]==node_q_path[i]){result=node_p_path[i];}}return result;}private:void preorder(TreeNode* Node,TreeNode* search,vector<TreeNode*>& path,vector<TreeNode*>& result,int finish){if(!Node||finish==1){return;}path.push_back(Node);if(Node==search){finish=1;result=path;}preorder(Node->left,search,path,result,finish);preorder(Node->right,search,path,result,finish);path.pop_back();} };4.二叉樹展開為鏈表
4.1 題目描述
給你二叉樹的根結(jié)點(diǎn) root ,請你將它展開為一個(gè)單鏈表:
展開后的單鏈表應(yīng)該同樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個(gè)結(jié)點(diǎn),而左子指針始終為 null 。
展開后的單鏈表應(yīng)該與二叉樹 先序遍歷 順序相同。
4.2 思考
4.3 C++實(shí)現(xiàn)
/*** 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 flatten(TreeNode* root) {vector<TreeNode*> node_vec;preorder(root,node_vec);for(int i=1;i<node_vec.size();i++){node_vec[i-1]->left=nullptr;node_vec[i-1]->right=node_vec[i];}} private:void preorder(TreeNode* Node,vector<TreeNode*> &node_vec){if(!Node){return;}node_vec.push_back(Node);preorder(Node->left,node_vec);preorder(Node->right,node_vec);} };4.4 解法二
4.5 C++實(shí)現(xiàn)
/*** 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 flatten(TreeNode* root) {TreeNode* last=nullptr;preorder(root,last);}private:void preorder(TreeNode* Node,TreeNode* &last){if(!Node){return;}if(!Node->left&&!Node->right){last=Node;return;}TreeNode* left=Node->left;TreeNode* right=Node->right;TreeNode* left_last=nullptr;TreeNode* right_last=nullptr;if(left){preorder(left,left_last);Node->left=nullptr;Node->right=left;last=left_last;}if(right){preorder(right,right_last);if(left_last){left_last->right=right;}last=right_last;}} };5.二叉樹的右視圖
5.1 預(yù)備知識
5.2 題目描述
給定一棵二叉樹,想象自己站在它的右側(cè),按照從頂部到底部的順序,返回從右側(cè)所能看到的節(jié)點(diǎn)值。
5.3 解題思路
5.4 C++實(shí)現(xiàn)
/*** 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:vector<int> rightSideView(TreeNode* root) {vector<int> view;queue<pair<TreeNode*,int>> Q;if(root){Q.push(make_pair(root,0));}while(!Q.empty()){TreeNode *node=Q.front().first;int depth=Q.front().second;Q.pop();if(depth==view.size()){view.push_back(node->val);}else{view[depth]=node->val;}if(node->left){Q.push(make_pair(node->left,depth+1));}if(node->right){Q.push(make_pair(node->right,depth+1));}}return view;} };6. 課程表
6.1 預(yù)備知識
6.1.1 什么是圖?
6.1.2 圖的表示
6.1.3 圖的深度優(yōu)先遍歷
6.1.4 圖的寬度優(yōu)先遍歷
6.2 題目描述
你這個(gè)學(xué)期必須選修 numCourses 門課程,記為 0 到 numCourses - 1 。
在選修某些課程之前需要一些先修課程。 先修課程按數(shù)組 prerequisites 給出,其中 prerequisites[i] = [ai, bi] ,表示如果要學(xué)習(xí)課程 ai 則 必須 先學(xué)習(xí)課程 bi 。
例如,先修課程對 [0, 1] 表示:想要學(xué)習(xí)課程 0 ,你需要先完成課程 1 。
請你判斷是否可能完成所有課程的學(xué)習(xí)?如果可以,返回 true ;否則,返回 false 。
6.3 分析
6.4 C++代碼實(shí)現(xiàn)
struct GraphNode{int label;vector<GraphNode*> neighbors;GraphNode(int x):label(x){}; }; class Solution { public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<GraphNode*> graph;vector<int> degree;for(int i=0;i<numCourses;i++){graph.push_back(new GraphNode(i));degree.push_back(0);}for(int i=0;i<prerequisites.size();i++){GraphNode* begin=graph[prerequisites[i][1]];GraphNode* end=graph[prerequisites[i][0]];begin->neighbors.push_back(end);degree[prerequisites[i][0]]++;}queue<GraphNode*> Q;for(int i=0;i<numCourses;i++){if(degree[i]==0){Q.push(graph[i]);}}while(!Q.empty()){GraphNode* node=Q.front();Q.pop();for(int i=0;i<node->neighbors.size();i++){degree[node->neighbors[i]->label]--;if(degree[node->neighbors[i]->label]==0){Q.push(node->neighbors[i]);}}}for(int i=0;i<numCourses;i++){delete graph[i];}for(int i=0;i<degree.size();i++){if(degree[i]){return false;}}return true;} };總結(jié)
以上是生活随笔為你收集整理的数据结构与算法——二叉树与图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统复习】系统调用
- 下一篇: 计算机网络——标准化工作及相关组织