【华为练习题】二叉树遍历

【华为练习题】二叉树遍历

题目

二叉树遍历 

描述: 二叉树的前序、中序、后序遍历的定义: 
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

输入: 
两个字符串,其长度n均小于等于26。 
第一行为前序遍历,第二行为中序遍历。 
二叉树中的结点名称以大写字母表示:A,B,C….最多26个结点。

输出: 
输入样例可能有多组,对于每组测试样例, 
输出一行,为后序遍历的字符串。

样例输入: 
ABC 
BAC 
FDXEAG 
XDEFAG

样例输出: 
BCA 
XEDGAF

分析

用递归的方式生成二叉树,再对二叉树进行后续遍历

解答

#include <iostream>
#include <string>
using namespace std;

struct BTreeNode
{
    char value;
    BTreeNode *left;
    BTreeNode *right;
};

void findBack(const string &front, const string &mid, BTreeNode *root){
    char value = front[0];
    int index = mid.find(value), length = (int)front.size();
    if (index < 0) return;
    if (index > 0)
    {
        char leftValue = front[1];
        BTreeNode *left = new BTreeNode;
        root->left = left;
        left->value = leftValue;
        left->left = NULL;
        left->right = NULL;
        findBack(string(front.begin()+1, front.begin()+index+1), string(mid.begin(), mid.begin()+index),left);
    }
    if (index < length - 1)
    {
        char rightValue = mid[index + 1];
        BTreeNode *right = new BTreeNode;
        root->right = right;
        right->value = rightValue;
        right->left = NULL;
        right->right = NULL;
        findBack(string(front.begin()+index+1, front.end()), string(mid.begin()+index+1,mid.end()),right);
    }
}

void backVisit(BTreeNode *root){
    if (root->left) backVisit(root->left);
    if (root->right) backVisit(root->right);
    cout << root->value;
    delete root;
}

int main(){
    string front, mid;
    while (cin >> front >> mid)
    {
        BTreeNode *root = new BTreeNode;
        root->value = front[0];
        findBack(front, mid, root);
        backVisit(root);
        cout << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xtfvje/article/details/82957710