33,008
社区成员
发帖
与我相关
我的任务
分享
表示方法:a( b(c,d), e(f,g) )
这是颗完全二叉树
b(c,d)是左子树
e(f,g)是右子树
a是根节点
写一个算法:可以这种表示方法来 构建二叉树。
struct BiTNood
{
char c;
BiTNode* left;
BiTNode* right;
};
void CreateBiTree(char s[], int len, BiTNood* & p)
{
//实现之
}
想用递归实现,但是递归的关键点-----设置好退出口。
void CreateTree(BiTNood* & node, char* s, int len)
{
if(len==1)
{
node=new BiTNood(s[0]);
return;
}
node=new BiTNood(s[0]);
下面的不会
我的难点在于, 比如创建左子树,那么是从 s+1开始,但是,在哪里结束呢??
找到那个","然后表示,但是嵌套可能会有很多层次的。我郁闷的地方就是如何正确找到
","
假设没有空格,或者有空格,但是我们可以把空格干掉,对吧。
一个网友提供了一个算法,我感觉有些问题,他没有回复我哦。
是否把递归的退出条件搞错了
len这个参数, 是表示: 树的节点及 所涉及到的 逗号。。。。。。
树是有逗号的,你也看到了,
len==1退出没有问题,
a(,)---------------这种情形能退出吗????
len-------------------------该子树所涉及到 节点及 逗号个数。。。。。。。。。
struct BiTNode
{
char c;
BiTNode* left;
BiTNode* right;
};
// 起始点是一个括号的内部
// 寻找分隔左右子树的逗号,条件是左子树开始,括号要匹配
int FindComma( char s[], int len ) {
int match = 0;
for( int i = 1; i < len; ++i ) {
if( s[i] == '(' ) ++match;
else if( s[i] == ')' ) --match;
else if( s[i] == ',' && match == 0 ) return i;
}
return -1;
}
void CreateBiTree(char s[], int len, BiTNood* & p)
{
if( len <= 0 ) return;
p = new BiTNode(); // p是指针类型,是按照引用传递进来的,这样改变p的值,函数外也能知晓,如果不是引用,例如CreateBiTree(char s[], int len, BiTNood* p)则不能这样做。
p->c = s[0];
if( len == 1 ) { p->left = p->right = NULL; } // 这是叶节点
else { // 这是枝干节点
int commaPos = FindComma( s+2, len-2 ); // s+2是左子树开始位置,commaPos是相对于左子树的偏移
CreateBiTree( s+2, commaPos, p->left );
CreateBiTree( s+2+commaPos+1, len-3-commaPos-1, p->right );
}
}