任务平台网站建设,成都景观设计公司,微信公众号推广,深圳品牌网站建设公司哪家好文章目录 第五课 树与图lc94.二叉树的中序遍历--简单题目描述代码展示 lc589.N叉树的层序遍历--中等题目描述代码展示 lc297.二叉树的序列化和反序列化--困难题目描述代码展示 lc105.从前序与中序遍历序列构造二叉树--中等题目描述代码展示 lc106.从中序与后序遍历序列构造二叉… 文章目录 第五课 树与图lc94.二叉树的中序遍历--简单题目描述代码展示 lc589.N叉树的层序遍历--中等题目描述代码展示 lc297.二叉树的序列化和反序列化--困难题目描述代码展示 lc105.从前序与中序遍历序列构造二叉树--中等题目描述代码展示 lc106.从中序与后序遍历序列构造二叉树--中等题目描述代码展示 lc236.二叉树的最近公共祖先LCA--中等题目描述代码展示 lc207.课程表--中等题目描述代码展示 lc210.课程表II--中等题目描述代码展示 lc684.冗余连接--中等题目描述代码展示   第五课 树与图 
lc94.二叉树的中序遍历–简单 
题目描述 
给定一个二叉树的根节点 root 返回 它的 中序 遍历 。 
示例 1 输入root  [1,null,2,3]
输出[1,3,2]示例 2 
输入root  []
输出[]示例 3 
输入root  [1]
输出[1]提示 
树中节点数目在范围 [0, 100] 内-100  Node.val  100 
代码展示 
/*** 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 inorder(TreeNode* root, vectorint res) {if (!root) {return;}inorder(root-left, res);res.push_back(root-val);inorder(root-right, res);}vectorint inorderTraversal(TreeNode* root) {vectorint res;inorder(root, res);return res;}
};lc589.N叉树的层序遍历–中等 
题目描述 
给定一个 N 叉树返回其节点值的层序遍历。即从左到右逐层遍历。 
树的序列化输入是用层序遍历每组子节点都由 null 值分隔参见示例。 
示例 1 输入root  [1,null,3,2,4,null,5,6]
输出[[1],[3,2,4],[5,6]]示例 2 输入root  [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]提示 
树的高度不会超过 1000树的节点总数在 [0, 10^4] 之间 
代码展示 
/*
// Definition for a Node.
class Node {
public:int val;vectorNode* children;Node() {}Node(int _val) {val  _val;}Node(int _val, vectorNode* _children) {val  _val;children  _children;}
};
*/class Solution {
public:     //广度优先搜索vectorvectorint levelOrder(Node* root) {if (!root) {return {};}vectorvectorint ans;queueNode* q;q.push(root);while (!q.empty()) {int cnt  q.size();vectorint level;for (int i  0; i  cnt; i) {Node* cur  q.front();q.pop();level.push_back(cur-val);for (Node* child: cur-children) {q.push(child);}}ans.push_back(move(level));}return ans;}
};lc297.二叉树的序列化和反序列化–困难 
题目描述 
序列化是将一个数据结构或者对象转换为连续的比特位的操作进而可以将转换后的数据存储在一个文件或者内存中同时也可以通过网络传输到另一个计算机环境采取相反方式重构得到原数据。 
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 
提示: 输入输出格式与 LeetCode 目前使用的方式一致详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式你也可以采用其他的方法解决这个问题。 
示例 1 输入root  [1,2,3,null,null,4,5]
输出[1,2,3,null,null,4,5]示例 2 
输入root  []
输出[]示例 3 
输入root  [1]
输出[1]示例 4 
输入root  [1,2]
输出[1,2]提示 
树中结点数在范围 [0, 104] 内-1000  Node.val  1000 
代码展示 
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Codec {
public:void rserialize(TreeNode* root, string str) {if (root  nullptr) {str  None,;} else {str  to_string(root-val)  ,;rserialize(root-left, str);rserialize(root-right, str);}}string serialize(TreeNode* root) {string ret;rserialize(root, ret);return ret;}TreeNode* rdeserialize(liststring dataArray) {if (dataArray.front()  None) {dataArray.erase(dataArray.begin());return nullptr;}TreeNode* root  new TreeNode(stoi(dataArray.front()));dataArray.erase(dataArray.begin());root-left  rdeserialize(dataArray);root-right  rdeserialize(dataArray);return root;}TreeNode* deserialize(string data) {liststring dataArray;string str;for (auto ch : data) {if (ch  ,) {dataArray.push_back(str);str.clear();} else {str.push_back(ch);}}if (!str.empty()) {dataArray.push_back(str);str.clear();}return rdeserialize(dataArray);}
};// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans  deser.deserialize(ser.serialize(root));lc105.从前序与中序遍历序列构造二叉树–中等 
题目描述 
给定两个整数数组 preorder 和 inorder 其中 preorder 是二叉树的先序遍历 inorder 是同一棵树的中序遍历请构造二叉树并返回其根节点。 
示例 1: 输入: preorder  [3,9,20,15,7], inorder  [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]示例 2: 
输入: preorder  [-1], inorder  [-1]
输出: [-1]提示: 
1  preorder.length  3000inorder.length  preorder.length-3000  preorder[i], inorder[i]  3000preorder 和 inorder 均 无重复 元素inorder 均出现在 preorderpreorder 保证 为二叉树的前序遍历序列inorder 保证 为二叉树的中序遍历序列 
代码展示 
/*** 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 {
private:     unordered_mapint, int index;public:       //递归TreeNode* myBuildTree(const vectorint preorder, const vectorint inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {if (preorder_left  preorder_right) {return nullptr;}// 前序遍历中的第一个节点就是根节点int preorder_root  preorder_left;// 在中序遍历中定位根节点int inorder_root  index[preorder[preorder_root]];// 先把根节点建立出来TreeNode* root  new TreeNode(preorder[preorder_root]);// 得到左子树中的节点数目int size_left_subtree  inorder_root - inorder_left;// 递归地构造左子树并连接到根节点// 先序遍历中「从 左边界1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素root-left  myBuildTree(preorder, inorder, preorder_left  1, preorder_left  size_left_subtree, inorder_left, inorder_root - 1);// 递归地构造右子树并连接到根节点// 先序遍历中「从 左边界1左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位1 到 右边界」的元素root-right  myBuildTree(preorder, inorder, preorder_left  size_left_subtree  1, preorder_right, inorder_root  1, inorder_right);return root;}TreeNode* buildTree(vectorint preorder, vectorint inorder) {int n  preorder.size();// 构造哈希映射帮助我们快速定位根节点for (int i  0; i  n; i) {index[inorder[i]]  i;}return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);}
};/*** 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* buildTree(vectorint preorder, vectorint inorder) {if (!preorder.size()) {return nullptr;}TreeNode* root  new TreeNode(preorder[0]);stackTreeNode* stk;stk.push(root);int inorderIndex  0;for (int i  1; i  preorder.size(); i) {int preorderVal  preorder[i];TreeNode* node  stk.top();if (node-val ! inorder[inorderIndex]) {node-left  new TreeNode(preorderVal);stk.push(node-left);}else {while (!stk.empty()  stk.top()-val  inorder[inorderIndex]) {node  stk.top();stk.pop();inorderIndex;}node-right  new TreeNode(preorderVal);stk.push(node-right);}}return root;}
};lc106.从中序与后序遍历序列构造二叉树–中等 
题目描述 
给定两个整数数组 inorder 和 postorder 其中 inorder 是二叉树的中序遍历 postorder 是同一棵树的后序遍历请你构造并返回这颗 二叉树 。 
示例 1: 输入inorder  [9,3,15,20,7], postorder  [9,15,7,20,3]
输出[3,9,20,null,null,15,7]示例 2: 
输入inorder  [-1], postorder  [-1]
输出[-1]提示: 
1  inorder.length  3000postorder.length  inorder.length-3000  inorder[i], postorder[i]  3000inorder 和 postorder 都由 不同 的值组成postorder 中每一个值都在 inorder 中inorder 保证是树的中序遍历postorder 保证是树的后序遍历 
代码展示 
/*** 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 {int post_idx;unordered_mapint, int idx_map;
public:     //递归TreeNode* helper(int in_left, int in_right, vectorint inorder, vectorint postorder){// 如果这里没有节点构造二叉树了就结束if (in_left  in_right) {return nullptr;}// 选择 post_idx 位置的元素作为当前子树根节点int root_val  postorder[post_idx];TreeNode* root  new TreeNode(root_val);// 根据 root 所在位置分成左右两棵子树int index  idx_map[root_val];// 下标减一post_idx--;// 构造右子树root-right  helper(index  1, in_right, inorder, postorder);// 构造左子树root-left  helper(in_left, index - 1, inorder, postorder);return root;}TreeNode* buildTree(vectorint inorder, vectorint postorder) {// 从后序遍历的最后一个元素开始post_idx  (int)postorder.size() - 1;// 建立元素下标键值对的哈希表int idx  0;for (auto val : inorder) {idx_map[val]  idx;}return helper(0, (int)inorder.size() - 1, inorder, postorder);}
};/*** 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* buildTree(vectorint inorder, vectorint postorder) {if (postorder.size()  0) {return nullptr;}auto root  new TreeNode(postorder[postorder.size() - 1]);auto s  stackTreeNode*();s.push(root);int inorderIndex  inorder.size() - 1;for (int i  int(postorder.size()) - 2; i  0; i--) {int postorderVal  postorder[i];auto node  s.top();if (node-val ! inorder[inorderIndex]) {node-right  new TreeNode(postorderVal);s.push(node-right);} else {while (!s.empty()  s.top()-val  inorder[inorderIndex]) {node  s.top();s.pop();inorderIndex--;}node-left  new TreeNode(postorderVal);s.push(node-left);}}return root;}
};lc236.二叉树的最近公共祖先LCA–中等 
题目描述 
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 
百度百科中最近公共祖先的定义为“对于有根树 T 的两个节点 p、q最近公共祖先表示为一个节点 x满足 x 是 p、q 的祖先且 x 的深度尽可能大一个节点也可以是它自己的祖先。” 
示例 1 输入root  [3,5,1,6,2,0,8,null,null,7,4], p  5, q  1
输出3
解释节点 5 和节点 1 的最近公共祖先是节点 3 。示例 2 输入root  [3,5,1,6,2,0,8,null,null,7,4], p  5, q  4
输出5
解释节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。示例 3 
输入root  [1,2], p  1, q  2
输出1提示 
树中节点数目在范围 [2, 105] 内。-109  Node.val  109所有 Node.val 互不相同 。p ! qp 和 q 均存在于给定的二叉树中。 
代码展示 
/*** 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* ans;bool dfs(TreeNode* root, TreeNode* p, TreeNode* q) {if (root  nullptr) return false;bool lson  dfs(root-left, p, q);bool rson  dfs(root-right, p, q);if ((lson  rson) || ((root-val  p-val || root-val  q-val)  (lson || rson))) {ans  root;} return lson || rson || (root-val  p-val || root-val  q-val);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {dfs(root, p, q);return ans;}
};/*** 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:        //存储父节点unordered_mapint, TreeNode* fa;unordered_mapint, bool vis;void dfs(TreeNode* root){if (root-left ! nullptr) {fa[root-left-val]  root;dfs(root-left);}if (root-right ! nullptr) {fa[root-right-val]  root;dfs(root-right);}}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {fa[root-val]  nullptr;dfs(root);while (p ! nullptr) {vis[p-val]  true;p  fa[p-val];}while (q ! nullptr) {if (vis[q-val]) return q;q  fa[q-val];}return nullptr;}
};lc207.课程表–中等 
题目描述 
你这个学期必须选修 numCourses 门课程记为 0 到 numCourses - 1 。 
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出其中 prerequisites[i]  [ai, bi] 表示如果要学习课程 ai 则 必须 先学习课程 bi 。 
例如先修课程对 [0, 1] 表示想要学习课程 0 你需要先完成课程 1 。 
请你判断是否可能完成所有课程的学习如果可以返回 true 否则返回 false 。 
示例 1 
输入numCourses  2, prerequisites  [[1,0]]
输出true
解释总共有 2 门课程。学习课程 1 之前你需要完成课程 0 。这是可能的。示例 2 
输入numCourses  2, prerequisites  [[1,0],[0,1]]
输出false
解释总共有 2 门课程。学习课程 1 之前你需要先完成课程 0 并且学习课程 0 之前你还应先完成课程 1 。这是不可能的。提示 
1  numCourses  20000  prerequisites.length  5000prerequisites[i].length  20  ai, bi  numCoursesprerequisites[i] 中的所有课程对 互不相同 
代码展示 
class Solution {
private:vectorvectorint edges;vectorint visited;bool valid  true;public:       //深度优先搜索void dfs(int u) {visited[u]  1;for (int v: edges[u]) {if (visited[v]  0) {dfs(v);if (!valid) {return;}}else if (visited[v]  1) {valid  false;return;}}visited[u]  2;}bool canFinish(int numCourses, vectorvectorint prerequisites) {edges.resize(numCourses);visited.resize(numCourses);for (const auto info: prerequisites) {edges[info[1]].push_back(info[0]);}for (int i  0; i  numCourses  valid; i) {if (!visited[i]) {dfs(i);}}return valid;}
};class Solution {
private:vectorvectorint edges;vectorint indeg;public:       //广度优先搜索bool canFinish(int numCourses, vectorvectorint prerequisites) {edges.resize(numCourses);indeg.resize(numCourses);for (const auto info: prerequisites) {edges[info[1]].push_back(info[0]);indeg[info[0]];}queueint q;for (int i  0; i  numCourses; i) {if (indeg[i]  0) {q.push(i);}}int visited  0;while (!q.empty()) {visited;int u  q.front();q.pop();for (int v: edges[u]) {--indeg[v];if (indeg[v]  0) {q.push(v);}}}return visited  numCourses;}
};lc210.课程表II–中等 
题目描述 
现在你总共有 numCourses 门课需要选记为 0 到 numCourses - 1。给你一个数组 prerequisites 其中 prerequisites[i]  [ai, bi] 表示在选修课程 ai 前 必须 先选修 bi 。 
例如想要学习课程 0 你需要先完成课程 1 我们用一个匹配来表示[0,1] 。 
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序你只要返回 任意一种 就可以了。如果不可能完成所有课程返回 一个空数组 。 
示例 1 
输入numCourses  2, prerequisites  [[1,0]]
输出[0,1]
解释总共有 2 门课程。要学习课程 1你需要先完成课程 0。因此正确的课程顺序为 [0,1] 。示例 2 
输入numCourses  4, prerequisites  [[1,0],[2,0],[3,1],[3,2]]
输出[0,2,1,3]
解释总共有 4 门课程。要学习课程 3你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。示例 3 
输入numCourses  1, prerequisites  []
输出[0]提示 
1  numCourses  20000  prerequisites.length  numCourses * (numCourses - 1)prerequisites[i].length  20  ai, bi  numCoursesai ! bi所有[ai, bi] 互不相同 
代码展示 
class Solution {
private:// 存储有向图vectorvectorint edges;// 标记每个节点的状态0未搜索1搜索中2已完成vectorint visited;// 用数组来模拟栈下标 0 为栈底n-1 为栈顶vectorint result;// 判断有向图中是否有环bool valid  true;public:          //深度优先搜索void dfs(int u) {// 将节点标记为「搜索中」visited[u]  1;// 搜索其相邻节点// 只要发现有环立刻停止搜索for (int v: edges[u]) {// 如果「未搜索」那么搜索相邻节点if (visited[v]  0) {dfs(v);if (!valid) {return;}}// 如果「搜索中」说明找到了环else if (visited[v]  1) {valid  false;return;}}// 将节点标记为「已完成」visited[u]  2;// 将节点入栈result.push_back(u);}vectorint findOrder(int numCourses, vectorvectorint prerequisites) {edges.resize(numCourses);visited.resize(numCourses);for (const auto info: prerequisites) {edges[info[1]].push_back(info[0]);}// 每次挑选一个「未搜索」的节点开始进行深度优先搜索for (int i  0; i  numCourses  valid; i) {if (!visited[i]) {dfs(i);}}if (!valid) {return {};}// 如果没有环那么就有拓扑排序// 注意下标 0 为栈底因此需要将数组反序输出reverse(result.begin(), result.end());return result;}
};class Solution {
private:// 存储有向图vectorvectorint edges;// 存储每个节点的入度vectorint indeg;// 存储答案vectorint result;public:         //广度优先搜索vectorint findOrder(int numCourses, vectorvectorint prerequisites) {edges.resize(numCourses);indeg.resize(numCourses);for (const auto info: prerequisites) {edges[info[1]].push_back(info[0]);indeg[info[0]];}queueint q;// 将所有入度为 0 的节点放入队列中for (int i  0; i  numCourses; i) {if (indeg[i]  0) {q.push(i);}}while (!q.empty()) {// 从队首取出一个节点int u  q.front();q.pop();// 放入答案中result.push_back(u);for (int v: edges[u]) {--indeg[v];// 如果相邻节点 v 的入度为 0就可以选 v 对应的课程了if (indeg[v]  0) {q.push(v);}}}if (result.size() ! numCourses) {return {};}return result;}
};lc684.冗余连接–中等 
题目描述 
树可以看成是一个连通且 无环 的 无向 图。 
给定往一棵 n 个节点 (节点值 1n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges edges[i]  [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。 
请找出一条可以删去的边删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案则返回数组 edges 中最后出现的那个。 
示例 1 输入: edges  [[1,2], [1,3], [2,3]]
输出: [2,3]示例 2 输入: edges  [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]提示: 
n  edges.length3  n  1000edges[i].length  21  ai  bi  edges.lengthai ! biedges 中无重复元素给定的图是连通的 
代码展示 
class Solution {
public:        //并查集int Find(vectorint parent, int index) {if (parent[index] ! index) {parent[index]  Find(parent, parent[index]);}return parent[index];}void Union(vectorint parent, int index1, int index2) {parent[Find(parent, index1)]  Find(parent, index2);}vectorint findRedundantConnection(vectorvectorint edges) {int n  edges.size();vectorint parent(n  1);for (int i  1; i  n; i) {parent[i]  i;}for (auto edge: edges) {int node1  edge[0], node2  edge[1];if (Find(parent, node1) ! Find(parent, node2)) {Union(parent, node1, node2);} else {return edge;}}return vectorint{};}
};
 文章转载自: http://www.morning.hclqy.cn.gov.cn.hclqy.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.ymsdr.cn.gov.cn.ymsdr.cn http://www.morning.pxlpt.cn.gov.cn.pxlpt.cn http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn http://www.morning.ymsdr.cn.gov.cn.ymsdr.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.cpfx.cn.gov.cn.cpfx.cn http://www.morning.ylqpp.cn.gov.cn.ylqpp.cn http://www.morning.fwgnq.cn.gov.cn.fwgnq.cn http://www.morning.rdymd.cn.gov.cn.rdymd.cn http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.kyctc.cn.gov.cn.kyctc.cn http://www.morning.hpprx.cn.gov.cn.hpprx.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.rcjwl.cn.gov.cn.rcjwl.cn http://www.morning.rfbt.cn.gov.cn.rfbt.cn http://www.morning.cpfx.cn.gov.cn.cpfx.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.mtrz.cn.gov.cn.mtrz.cn http://www.morning.zffn.cn.gov.cn.zffn.cn http://www.morning.zcrjq.cn.gov.cn.zcrjq.cn http://www.morning.wfzdh.cn.gov.cn.wfzdh.cn http://www.morning.nyqb.cn.gov.cn.nyqb.cn http://www.morning.mmzfl.cn.gov.cn.mmzfl.cn http://www.morning.nxzsd.cn.gov.cn.nxzsd.cn http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn http://www.morning.pbmg.cn.gov.cn.pbmg.cn http://www.morning.dwfxl.cn.gov.cn.dwfxl.cn http://www.morning.zbkdm.cn.gov.cn.zbkdm.cn http://www.morning.tqklh.cn.gov.cn.tqklh.cn http://www.morning.jxmjr.cn.gov.cn.jxmjr.cn http://www.morning.ntzfl.cn.gov.cn.ntzfl.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.lsgjf.cn.gov.cn.lsgjf.cn http://www.morning.kzhxy.cn.gov.cn.kzhxy.cn http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.rnsjp.cn.gov.cn.rnsjp.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.lkbkd.cn.gov.cn.lkbkd.cn http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.qcztm.cn.gov.cn.qcztm.cn http://www.morning.rdqzl.cn.gov.cn.rdqzl.cn http://www.morning.dkqbc.cn.gov.cn.dkqbc.cn http://www.morning.prqdr.cn.gov.cn.prqdr.cn http://www.morning.bmsqq.cn.gov.cn.bmsqq.cn http://www.morning.zsleyuan.cn.gov.cn.zsleyuan.cn http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn http://www.morning.nxcgp.cn.gov.cn.nxcgp.cn http://www.morning.wqnc.cn.gov.cn.wqnc.cn http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn http://www.morning.kcwkt.cn.gov.cn.kcwkt.cn http://www.morning.tsxg.cn.gov.cn.tsxg.cn http://www.morning.qkqpy.cn.gov.cn.qkqpy.cn http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn http://www.morning.pqqzd.cn.gov.cn.pqqzd.cn http://www.morning.klrpm.cn.gov.cn.klrpm.cn http://www.morning.knrgb.cn.gov.cn.knrgb.cn http://www.morning.hbywj.cn.gov.cn.hbywj.cn http://www.morning.dmtwz.cn.gov.cn.dmtwz.cn http://www.morning.ndynz.cn.gov.cn.ndynz.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.trhlb.cn.gov.cn.trhlb.cn http://www.morning.yfphk.cn.gov.cn.yfphk.cn http://www.morning.xknsn.cn.gov.cn.xknsn.cn http://www.morning.dhnqt.cn.gov.cn.dhnqt.cn http://www.morning.lnbyk.cn.gov.cn.lnbyk.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.jwbnm.cn.gov.cn.jwbnm.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn http://www.morning.wyrkp.cn.gov.cn.wyrkp.cn http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.dpplr.cn.gov.cn.dpplr.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.xrhst.cn.gov.cn.xrhst.cn http://www.morning.brwnd.cn.gov.cn.brwnd.cn