练习4.1 根据后序和中序遍历输出先序遍历
时间: 2023-11-17 14:08:55 浏览: 52
根据后序和中序遍历输出先序遍历的方法如下:
1. 后序遍历的最后一个节点为根节点,将其输出。
2. 在中序遍历中找到根节点的位置,将中序遍历分为左子树和右子树两部分。
3. 根据左子树和右子树的长度,在后序遍历中分出左子树和右子树两部分。
4. 递归地对左子树和右子树进行上述操作,直到遍历完整棵树。
5. 输出的顺序即为先序遍历的顺序。
下面是代码实现:
```
void postToPre(int post[], int in[], int n) {
int root = post[n-1];
printf("%d ", root);
int i;
for (i = 0; i < n; i++) {
if (in[i] == root) {
break;
}
}
if (i > 0) {
postToPre(post, in, i);
}
if (i < n-1) {
postToPre(post+i, in+i+1, n-i-1);
}
}
```
相关问题
建立以左右孩子链接结构表示的二叉树,实现二叉树的先序、中序、后序的递归和非递归方式遍历,分层遍历、统计树的高度。
好的,我可以为您解答。以下是基于左右孩子链接结构表示的二叉树的相关算法实现:
### 1. 二叉树结构定义
```
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
```
### 2. 二叉树先序遍历
#### 2.1 递归实现
```
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
```
#### 2.2 非递归实现
```
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* cur = s.top();
s.pop();
cout << cur->val << " ";
if (cur->right) s.push(cur->right);
if (cur->left) s.push(cur->left);
}
}
```
### 3. 二叉树中序遍历
#### 3.1 递归实现
```
void inorderTraversal(TreeNode* root) {
if (root == NULL) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
```
#### 3.2 非递归实现
```
void inorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s;
TreeNode* cur = root;
while (cur != NULL || !s.empty()) {
while (cur != NULL) {
s.push(cur);
cur = cur->left;
}
cur = s.top();
s.pop();
cout << cur->val << " ";
cur = cur->right;
}
}
```
### 4. 二叉树后序遍历
#### 4.1 递归实现
```
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
```
#### 4.2 非递归实现
```
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s;
s.push(root);
TreeNode* pre = NULL;
while (!s.empty()) {
TreeNode* cur = s.top();
if ((cur->left == NULL && cur->right == NULL) || (pre != NULL && (pre == cur->left || pre == cur->right))) {
cout << cur->val << " ";
s.pop();
pre = cur;
} else {
if (cur->right != NULL) s.push(cur->right);
if (cur->left != NULL) s.push(cur->left);
}
}
}
```
### 5. 二叉树分层遍历
```
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if (root == NULL) return res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
vector<int> level;
for (int i = 0; i < size; i++) {
TreeNode* cur = q.front();
q.pop();
level.push_back(cur->val);
if (cur->left) q.push(cur->left);
if (cur->right) q.push(cur->right);
}
res.push_back(level);
}
return res;
}
```
### 6. 统计二叉树高度
```
int maxDepth(TreeNode* root) {
if (root == NULL) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return max(leftDepth, rightDepth) + 1;
}
```
希望以上算法能够帮助您解决问题。
c++实现二叉树的遍历
以下是C++中二叉树前序、中序、后序遍历的递归和非递归实现,以及层序遍历和深度优先遍历的代码和讲解:
1.1 前序遍历(Preorder Traversal)- 递归实现
```c++
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " "; // 输出节点值
preorderTraversal(root->left); // 遍历左子树
preorderTraversal(root->right); // 遍历右子树
}
```
1.2 前序遍历(Preorder Traversal)- 非递归实现
```c++
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> s;
s.push(root);
while (!.empty()) {
TreeNode* node = s.top();
s.pop();
cout << node->val << " "; // 输出节点值
if (node->right != NULL) {
s.push(node->right); // 先将右子树入栈
}
if (node->left != NULL) {
s.push(node->left); // 再将左子树入栈
}
}
}
```
2.1 中序遍历(Inorder Traversal)- 递归实现
```c++
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left); // 遍历左子树
cout << root->val << " "; // 输出节点值
inorderTraversal(root->right); // 遍历右子树
}
```
2.2 中序遍历(Inorder Traversal)- 非递归实现
```c++
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> s;
TreeNode* node = root;
while (node != NULL || !s.empty()) {
while (node != NULL) {
s.push(node);
node = node->left; // 将左子树入栈
}
node = s.top();
s.pop();
cout << node->val << " "; // 输出节点值
node = node->right; // 遍历右子树
}
}
```
3.1 后序遍历(Postorder Traversal)- 递归实现
```c++
void postorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left); // 遍历左子树
postorderTraversal(root->right); // 遍历右子树
cout << root->val << " "; // 输出节点值
}
```
3.2 后序遍历(Postorder Traversal)- 非递归实现
```c++
void postorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> s1, s2;
s1.push(root);
while (!s1.empty()) {
TreeNode* node = s1.top();
s1.pop();
s2.push(node);
if (node->left != NULL) {
s1.push(node->left); // 先将左子树入栈
}
if (node->right != NULL) {
s1.push(node->right); // 再将右子树入栈
}
}
while (!s2.empty()) {
TreeNode* node = s2.top();
s2.pop();
cout << node->val << " "; // 输出节点值
}
}
```
4.1 层序遍历(Level Order Traversal)
```c++
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " "; // 输出节点值
if (node->left != NULL) {
q.push(node->left); // 将左子树入队
}
if (node->right != NULL) {
q.push(node->right); // 将右子树入队
}
}
}
}
```
5.1 深度优先遍历(Depth First Traversal)
```c++
void dfs(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
cout << node->val << " "; // 输出节点值
if (node->right != NULL) {
s.push(node->right); // 先将右子树入栈
}
if (node->left != NULL) {
s.push(node->left); // 再将左子树入栈
}
}
}
```