已知前序中序,求后序

已知二叉树的前序和中序,求其后序

例:前序(A B D G H C E I F J ) 中序(G D H B A E I C J F) 其后序为:G H D B I E J F C A

思路:先序的遍历规则为根—左—右,中序的遍历规则为左—根—右,所以我们在中序中找到与A(A必为根)相等的字符,则在中序中G D H B为A的左子树,E I C J F为A的右子树,在左子树和右子树中,重复前面过程,最后逆向将根打印出来,就是其后序。是一个递归过程
#include <iostream>
#include <string>
using namespace std;
string s;
string ss;
void tree(int a_l, int a_r, int b_l, int b_r)
{//a_l,a_r分别表示前序子树中的左右端点
    int i;
    if (a_l == a_r)
    {
        cout << s[a_l];
        return;//递归终止
    }
    for ( i = b_l; i <= b_r; i++)
    {
        if (s[a_l] == ss[i])
        {
            tree(a_l + 1, a_l + i - b_l, b_l, i - 1);//先处理左子树
            tree(a_l + i - b_l + 1, a_r, i + 1, b_r);//后处理右子树
            cout << s[a_l];
        }
    }
}
int main(void)
{
    cin >> s >> ss;
    tree(0, s.size() - 1, 0, ss.size() - 1);
    return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下为 C 语言的二叉树已知前序中序后序的完整代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点 typedef struct node { char data; struct node *left; struct node *right; } TreeNode; // 递归构建二叉树 TreeNode* buildTree(char *preorder, char *inorder, int preStart, int preEnd, int inStart, int inEnd) { if (preStart > preEnd || inStart > inEnd) { return NULL; } // 获取前序遍历的根节点 TreeNode *root = (TreeNode*) malloc(sizeof(TreeNode)); root->data = preorder[preStart]; root->left = NULL; root->right = NULL; // 找到中序遍历中根节点的位置 int rootIndex; for (int i = inStart; i <= inEnd; i++) { if (inorder[i] == preorder[preStart]) { rootIndex = i; break; } } // 递归构建左子树和右子树 root->left = buildTree(preorder, inorder, preStart+1, preStart+rootIndex-inStart, inStart, rootIndex-1); root->right = buildTree(preorder, inorder, preStart+rootIndex-inStart+1, preEnd, rootIndex+1, inEnd); return root; } // 后序遍历输出二叉树 void postorderTraversal(TreeNode *root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%c", root->data); } int main(void) { char preorder[] = {'A', 'B', 'D', 'E', 'C', 'F'}; char inorder[] = {'D', 'B', 'E', 'A', 'F', 'C'}; TreeNode *root = buildTree(preorder, inorder, 0, 5, 0, 5); printf("后序遍历结果:"); postorderTraversal(root); printf("\n"); return 0; } ``` 以上代码实现了已知前序遍历和中序遍历构建二叉树,并输出后序遍历的结果。需要注意的是,代码中的前序遍历和中序遍历都是以字符数组的形式给出的,可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值