括号表示法,恢复二叉树

wzuxian2012 2012-05-26 01:48:37
表示方法: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开始,但是,在哪里结束呢??

找到那个","然后表示,但是嵌套可能会有很多层次的。我郁闷的地方就是如何正确找到
","


...全文
423 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzuxian2012 2012-05-26
  • 打赏
  • 举报
回复
假设没有空格,或者有空格,但是我们可以把空格干掉,对吧。


一个网友提供了一个算法,我感觉有些问题,他没有回复我哦。


是否把递归的退出条件搞错了


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 );
}
}






[Quote=引用 3 楼 的回复:]

比如传进来一个字符串:a(x(b,c),y(d,e))
则字符'a'给根节点,x(b,c) 和y(d,e)分别给左右子节点
如果传进来字符为空,或是只有一个字符,如'b',则b赋值给根节点,子节点赋值为NULL,然后return,无需进入递归。
这样一层层解析吧。

PS:涉及空格的字符串解析很是恶心的
[/Quote]
昵称很不好取 2012-05-26
  • 打赏
  • 举报
回复
比如传进来一个字符串:a(x(b,c),y(d,e))
则字符'a'给根节点,x(b,c) 和y(d,e)分别给左右子节点
如果传进来字符为空,或是只有一个字符,如'b',则b赋值给根节点,子节点赋值为NULL,然后return,无需进入递归。
这样一层层解析吧。

PS:涉及空格的字符串解析很是恶心的
freud.wy 2012-05-26
  • 打赏
  • 举报
回复 1
从s+1开始,用一个栈记录读到的括号,遇到一对括号的时候就把栈顶的括号消掉当栈为空的时候后面的一个逗号就是要找的逗号,然后把s+1到这个逗号中间的部分递归进入下一层。
wzuxian2012 2012-05-26
  • 打赏
  • 举报
回复



高手

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧