(数据结构)如何根据树的后序中序遍历求树的前序遍历

后序+中序->前序

思路借鉴于伟大的柳婼小姐姐~

  由于树的后序遍历顺序是:左 右 根

    树的中序遍历顺序是:左 根 右

  所以后序遍历中每一段的最后位置节点就是该子树的根节点。比如对于后序遍历 3 4 2 6 5 1,1是该树的根节点。然后我们从中序遍历中找到1的位置,那么1的左边即为树的左子树,右边为右子树。由此可以知道左子树和右子树各有多少个节点。因为不论什么顺序的遍历,同一边的子树节点不会分开,所以如果中序遍历为3 2 4 1 6 5,3 2 4为左子树,长度为3,所以在后序遍历中前三位一定是左子树,2是3 4 2的最后位,所以2是左子树的根节点,以此类推。

  可以写递归函数求先序遍历。dfs(root,st,ed);其中root为后序遍历中的根节点位置,st和ed是以root为根节点的子树在中序遍历中的位置。因为后序的最后一个总是根结点,令i在中序中找到该根结点,则i把中序分为两部分,左边是左子树,右边是右子树。因为是输出先序(根左右),所以先打印出当前根结点,然后打印左子树,再打印右子树。左子树在后序中的根结点为root – (end – i + 1),即为当前根结点-右子树的个数。左子树在中序中的起始点start为start,末尾end点为i – 1.右子树的根结点为当前根结点的前一个结点root – 1,右子树的起始点start为i+1,末尾end点为end。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int post[20],in[20];
 6 //root是后序中的当前根的位置,st,ed是该子树在中序遍历中的最左位置和最右位置 
 7 void dfs(int root,int st,int ed)
 8 {
 9     if(st>ed)
10         return;
11     int i=st;
12     while(in[i]!=post[root])
13         i++;
14     cout<<post[root]<<" ";
15     dfs(root-(ed-i+1),st,i-1);
16     dfs(root-1,i+1,ed);
17  } 
18 int main()
19 {
20     int n;
21     cin>>n;
22     for(int i=0;i<n;i++)
23         cin>>post[i];
24     for(int i=0;i<n;i++)
25         cin>>in[i];
26     dfs(n-1,0,n-1);
27     return 0;    
28 }

 

转载于:https://www.cnblogs.com/1013star/p/11569194.html

是一种常用的数据结构,具有分层的特点。在的结构中,常常需要对进行遍历操作,包括前序遍历中序遍历后序遍历和层次遍历。 前序遍历(Preorder Traversal)是指先遍历节点,再遍历左子,最后遍历右子。可以通过递归或者栈的方式实现前序遍历中序遍历(Inorder Traversal)是指先遍历左子,再遍历节点,最后遍历右子。同样可以通过递归或者栈的方式实现中序遍历后序遍历(Postorder Traversal)是指先遍历左子,再遍历右子,最后遍历节点。同样可以通过递归或者栈的方式实现后序遍历。 层次遍历(Level Order Traversal)是指从上到下逐层遍历的节点。可以利用队列的方式实现层次遍历,先将节点入队,然后依次将每个节点的左右子节点入队,直到队列为空。 在C语言中,可以利用结构体和指针表示的节点,通过递归或者迭代的方式实现的遍历操作。可以使用数组、链表或者队列等数据结构来辅助实现。 以下是一段C语言代码示例,演示了如何实现的前序、中序、后序和层次遍历操作: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 前序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) return; printf("%d ", root->data); preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->data); } // 层次遍历 void levelOrderTraversal(TreeNode* root) { if (root == NULL) return; TreeNode* queue[100]; // 使用数组模拟队列 int front = 0; int rear = 0; queue[rear++] = root; while (front < rear) { TreeNode* node = queue[front++]; printf("%d ", node->data); if (node->left != NULL) { queue[rear++] = node->left; } if (node->right != NULL) { queue[rear++] = node->right; } } } int main() { // 创建一棵 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->data = 2; root->right->data = 3; root->left->left = NULL; root->left->right = NULL; root->right->left = NULL; root->right->right = NULL; printf("前序遍历结果:"); preorderTraversal(root); printf("\n中序遍历结果:"); inorderTraversal(root); printf("\n后序遍历结果:"); postorderTraversal(root); printf("\n层次遍历结果:"); levelOrderTraversal(root); return 0; } ``` 以上代码中,先定义了的结构体`TreeNode`,包含数据、左子指针和右子指针。然后定义了四个遍历函数,据不同的遍历方式实现相应的遍历过程。在`main`函数中,创建了一棵,并调用四个遍历函数分别进行遍历操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值