[C++]图的生成和图的遍历
时间: 2024-01-06 08:03:10 浏览: 23
图的生成有多种方法,其中比较常用的是手动输入节点和边的方式生成图,另一种则是使用随机算法生成随机图。
手动输入节点和边的方式生成图的步骤如下:
1. 确定节点数量和边数量。
2. 为每个节点标号或命名。
3. 根据需要,为每个节点添加权值或其他属性。
4. 输入每条边的起始节点和终止节点,以及边的权值或其他属性。
随机算法生成随机图的步骤如下:
1. 确定节点数量和边数量。
2. 随机生成节点和边。
3. 根据需要,为每个节点添加权值或其他属性。
图的遍历有两种基本方法:深度优先遍历和广度优先遍历。
深度优先遍历的基本思路是从起始节点开始,沿着一条路径一直走到底,直到不能继续为止,然后回溯到前一个节点,继续走下一条路径,直到遍历完整个图。
广度优先遍历的基本思路是从起始节点开始,依次遍历与该节点相邻的节点,然后再依次遍历与这些相邻节点相邻的节点,直到遍历完整个图。
相关问题
C++生成前序遍历和中序遍历恢复二叉树
题目描述:
输入一棵二叉树的前序遍历和中序遍历,输出该二叉树的后序遍历。
解题思路:
根据二叉树的前序遍历和中序遍历可以确定一棵二叉树。前序遍历的第一个节点是根节点,根据中序遍历可以得到左子树和右子树的节点个数,从而可以将前序遍历和中序遍历分成左子树和右子树的两部分,递归构建左子树和右子树。
递归终止条件为前序遍历和中序遍历为空,此时返回空节点。
C++代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
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) {
unordered_map<int, int> map;
for (int i = 0; i < inorder.size(); i++) {
map[inorder[i]] = i;
}
return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1, map);
}
private:
TreeNode* buildTree(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd, unordered_map<int, int>& map) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}
int rootVal = preorder[preStart];
int rootIndex = map[rootVal];
int leftNodes = rootIndex - inStart;
TreeNode* root = new TreeNode(rootVal);
root->left = buildTree(preorder, preStart + 1, preStart + leftNodes, inorder, inStart, rootIndex - 1, map);
root->right = buildTree(preorder, preStart + leftNodes + 1, preEnd, inorder, rootIndex + 1, inEnd, map);
return root;
}
};
void postorder(TreeNode* root) {
if (root == NULL) {
return;
}
postorder(root->left);
postorder(root->right);
cout << root->val << " ";
}
int main() {
vector<int> preorder = {1, 2, 4, 5, 3, 6};
vector<int> inorder = {4, 2, 5, 1, 3, 6};
Solution solution;
TreeNode* root = solution.buildTree(preorder, inorder);
postorder(root);
return 0;
}
```
输出结果为:
```
4 5 2 6 3 1
```
C++生成二叉树实现遍历,先序遍历采用递归算法,层次遍历采用非递归算法
好的,下面是C++生成二叉树实现遍历的代码,先序遍历采用递归算法,层次遍历采用非递归算法:
```c++
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 生成二叉树
void createTree(TreeNode*& root) {
int val;
cin >> val;
if (val == -1) {
root = NULL;
return;
}
root = new TreeNode(val);
createTree(root->left);
createTree(root->right);
}
// 先序遍历(递归)
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 层次遍历(非递归)
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
}
int main() {
TreeNode* root;
createTree(root);
cout << "先序遍历结果:";
preorderTraversal(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
我已经完成了你的要求,请问还有其他问题吗?
阅读全文