第08讲-树

本文介绍了两种树结构处理问题:一是通过先序和中序遍历构建并输出后序遍历;二是根据一系列节点父子关系判断树是否完整且根节点是否唯一。使用C++实现算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

课件(下载

【POJ2255】Tree Recovery


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

#define N 27

char pre[N];
char in [N];

void PostOrder( int preStart, int preEnd, int inStart, int inEnd)
{
if ( preStart <= preEnd )
{
char root = pre[preStart];

int leftLen;
for ( int i = inStart;i <= inEnd;i ++ )
{
if ( root == in [i] )
{
leftLen
= i - inStart;
break ;
}
}

PostOrder(
preStart
+ 1 ,
preStart
+ leftLen,
inStart,
inStart
+ leftLen - 1
);
PostOrder(
preStart
+ leftLen + 1 ,
preEnd,
inStart
+ leftLen + 1 ,
inEnd
);

cout
<< root;
}
}

int main()
{
while (cin >> pre >> in )
{
PostOrder(
0 ,strlen(pre) - 1 , 0 ,strlen( in ) - 1 );
cout
<< endl;
}
return 1 ;
}

 

【ZOJ1167】Trees on the Level


  
#include < map >
#include
< string >
#include
< iostream >
#include
< stdlib.h >
using namespace std;

class MySort
{
public :
bool operator ()( const string & _A, const string & _B) const
{
if (_A.length() < _B.length() )
return true ;
if (_A.length() == _B.length() && _A < _B )
return true ;
return false ;
}
};

map
< string , int ,MySort > data;

bool InsertNode( string str)
{
str
= str.substr( 1 ,str.length() - 2 );
int pos = str.find( ' , ' );
string key = str.substr(pos + 1 );
int value = atoi( str.substr( 0 ,pos).c_str() );

if ( data.find(key) != data.end() )
return false ;
else
{
pair
< map < string , int ,MySort > ::iterator, bool > insertPair;
insertPair
= data.insert( map < string , int ,MySort > ::value_type(key,value) );
return insertPair.second;
// data[key] = value;
// return true;
}
}

bool HasRoot()
{
// cout<<"asdf';
for (map < string , int ,MySort > ::iterator i = data.begin();i != data.end();i ++ )
{
string str = i -> first;

// cout << ' ' << str.substr(0,str.length()-1) << ' ';

if ( str.length() == 0 )
continue ;
if ( data.find(str.substr( 0 ,str.length() - 1 )) == data.end() )
return false ;
}
return true ;
}

int main()
{
string str;
bool complete = true ;
while ( cin >> str )
{
if (str == " () " )
{
// 一个测试结束,给出结论
if ( complete && HasRoot() )
{
map
< string , int ,MySort > ::iterator i;
for ( i = data.begin();i != data.end();i ++ )
{
if ( i != data.begin() )
cout
<< ' ' ;
cout
<< ( * i).second ;

}
}
else
{
cout
<< " not complete " ;
}

cout
<< endl;

// 新测试开始
// 初始化
data.clear();
complete
= true ;
}
else
{
// 加入map
if ( ! InsertNode(str) )
complete
= false ;
}
}
return 1 ;
}

 

转载于:https://www.cnblogs.com/tuty/archive/2010/10/25/1860478.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值