题解 | #二叉树遍历#
二叉树遍历
https://www.nowcoder.com/practice/6e732a9632bc4d12b442469aed7fe9ce
#include <iostream>
using namespace std;
// 给定:前序和中序, 构建树后, 给出后序遍历序列。
struct TreeNode
{
TreeNode * left ;
TreeNode * right ;
char elem ;
TreeNode(char c ) : elem(c) , left(nullptr) , right(nullptr) {} ;
};
TreeNode * build(string s1 , string s2)
{
if(s1.size() == 0 && s2.size() == 0)
{
return nullptr;
}
int i = 0 ;
char c = s1[i] ;
TreeNode * root = new TreeNode(c) ;
string l1 , l2 ;
while(s2[i] != c)
{
l1+= s2[i] ; // 左子树的中序序列
i++ ; //
}
i++ ;
while(i < s2.size())
{
l2 += s2[i] ; // 右子树的中序序列
i++ ;
}
// 依据中序 找 前序
i = 1 ;
string r1 , r2 ;
for(int t = 0; t < l1.size() ; ++ t)// 按照数量相等去找到。
{
r1 += s1[i] ;
i++ ;
}
for(int t = 0 ;t < l2.size() ; ++ t )
{
r2 += s1[i] ;
i++ ;
}
root->left = build(r1 , l1 ) ; // 左子树
root->right = build(r2 , l2 ) ; // 右子树
return root ;
}
void postorder(TreeNode * cur)
{
if(cur == nullptr)
{
return ;
}
postorder(cur->left) ;
postorder(cur->right) ;
cout<<cur->elem ;
}
int main() {
string s1 , s2 ;
while(cin>>s1) // 前序序列。
{
cin>>s2 ; // 中序序列
TreeNode * root = build(s1, s2 ) ;
postorder(root) ;
cout<<endl ;
}
}
// 64 位输出请用 printf("%lld")
