题目
问题 C: 二叉树后序线索(DS树)
时间限制: 1 Sec 内存限制: 128 MB
提交: 27 解决: 19
[ 提交] [ 状态] [ 讨论版]
题目描述
给定一棵二叉树的先序遍历的“带0 (零)表示”, 实现以下功能:
1 )二叉树的构建,并生成二叉树的后序遍历序列;
2 )求某个结点在后序遍历序列中的前驱与后继。
输入
第一行输入t表示有t个测试实例
每个测试实例包含2 行输入:
第1 行:二叉树先序遍历序列,空结点用字符零‘0 ’表示,无需考虑空树
第2 行:输入2 个指定结点的编号。
输出
每个测试实例输出2 行,每行输出指定结点在后序遍历的前驱结点和后继结点,用单个空格隔开。
若指定结点不存在则输出ERROR,若结点的前驱或后继结点不存在则输出- 1
样例输入
2
ABD000C00
D B
AB00CD00E00
E F
样例输出
-1 B
D C
D C
ERROR
代码块
#include <iostream>
using namespace std;
class BiTNode
{
char data;
BiTNode * lchild, * rchild;
friend class BiTree ;
} ;
class BiTree
{
BiTNode * root;
string s;
void PreOrderTraverse ( BiTNode * & p) ;
void PostOrderTraverse ( BiTNode * p) ;
public :
void PreOrder ( ) ;
void PostOrder ( ) ;
void Search ( ) ;
} ;
void BiTree:: PreOrder ( )
{
PreOrderTraverse ( root) ;
}
void BiTree:: PreOrderTraverse ( BiTNode * & p)
{
char ch;
cin>> ch;
if ( ch!= '0' )
{
p = new BiTNode;
p- > data = ch;
PreOrderTraverse ( p- > lchild) ;
PreOrderTraverse ( p- > rchild) ;
}
else
p = NULL ;
}
void BiTree:: PostOrder ( )
{
PostOrderTraverse ( root) ;
}
void BiTree:: PostOrderTraverse ( BiTNode * p)
{
if ( p)
{
PostOrderTraverse ( p- > lchild) ;
PostOrderTraverse ( p- > rchild) ;
s + = p- > data;
}
}
void BiTree:: Search ( )
{
int i;
char ch;
cin>> ch;
int len = ( int ) s. length ( ) ;
for ( i= 0 ; i< len; i++ )
{
if ( s[ i] == ch)
break ;
}
if ( i== len)
cout<< "ERROR" << endl;
else if ( ! i && i== len- 1 )
cout<< "-1 -1" << endl;
else if ( ! i && i!= len- 1 )
cout<< "-1 " << s[ i+ 1 ] << endl;
else if ( i && i== len- 1 )
cout<< s[ i- 1 ] << " -1" << endl;
else
cout<< s[ i- 1 ] << ' ' << s[ i+ 1 ] << endl;
}
int main ( void )
{
int t;
cin>> t;
while ( t-- )
{
BiTree myTree;
myTree. PreOrder ( ) ;
myTree. PostOrder ( ) ;
myTree. Search ( ) ;
myTree. Search ( ) ;
}
}