最近在LeetCode做题,二叉树出现错误时不好排查,于是自己写了一个函数,将前序遍历格式字串转换成二叉树。

  形如 "AB#D##C##" 的字符串,"#"表示孩子节点为空,算法如下:

  1.当前节点进栈 push(s,t)

  2.出栈: pcur=pop(s) ,判断当前字符
    a 不等于'#',申请新的节点pnew并赋给pcur的左或右孩子,当右孩子时将标记置真,pcur进栈,pnew进栈
    b 等于'#',如果当前为左孩子,左孩子置null,pcur进栈;
      当前为右孩子,右孩子置空,父节点出栈。如果pcur是父节点的左孩子,终止寻找;否则保存父节点为当前节点,继续寻找。

  代码如下:

TreeNode *creat_tree(char *str){
if( == strlen(str) ) return NULL;
TreeNode *t = (TreeNode *)malloc(sizeof(TreeNode));
TreeNode *pcur = NULL, *pnew = NULL;
Stack *s = init_s();
bool left_child = true;
t->data = *str;
push(s,t);
while( '\0' != *++str ){
pcur = pop(s);
printf(" pcur->data:%c, val:%c\n",pcur->data,*str );
if( '#' != *str ){
pnew = (TreeNode *)malloc(sizeof(TreeNode));
pnew->data = *str;
if( left_child ){
pcur->lchild = pnew;
}
else{
pcur->rchild = pnew;
left_child = true; // 下一个值要放到左孩子
}
push(s,pcur); // 父节点进栈
push(s,pnew); // 新的结点作为下一次的父节点
}
else{
if( left_child ){
pcur->lchild = NULL;
left_child = false; // 无左孩子,下一个轮到右孩子
push(s,pcur); // 当前节点进栈,下一个轮到右孩子
}
else{
pcur->rchild = NULL; // 无右孩子
while( ! empty_stack(s) ){
pnew = pop(s); // 取出父节点
if( pcur != pnew->lchild ){ // 判断pcur是否为左孩子
pcur = pnew; // 若不是,说明父节点已有2孩子
} // 继续查找,直到父节点只有左孩子
else{
push(s,pnew); // 节点进栈,下一个轮到右孩子
break;
}
}
printf(" right end\n");
}
}
}
return t;
}

  测试二叉树:

void PreOrderTraverse(TreeNode *t){
//printf("in PreOrderTraverse\n");
if( NULL == t ) return;
printf("%c",t->data);
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);
}
void InOrderTraverse(TreeNode *t){
if( NULL == t ) return;
InOrderTraverse(t->lchild);
printf("%c",t->data);
InOrderTraverse(t->rchild);
}
void PostOrderTraverse(TreeNode *t){
if( NULL == t ) return;
PostOrderTraverse(t->lchild);
PostOrderTraverse(t->rchild);
printf("%c",t->data);
}
int main(){
TreeNode *t = NULL;
char str[] = "ABDH#K###E##CFI###G#J##";
t = creat_tree(str);
PreOrderTraverse(t);
printf("\n");
InOrderTraverse(t);
printf("\n");
PostOrderTraverse(t);
printf("\n"); char str2[] = "AB##C##";
t = creat_tree(str2);
PreOrderTraverse(t);
printf("\n");
InOrderTraverse(t);
printf("\n");
PostOrderTraverse(t);
printf("\n");
}

  输出:

ABDHKECFIGJ
HKDBEAIFCGJ
KHDEBIFJGCA

ABC
BAC
BCA

C格式字符串转为二叉树的更多相关文章

  1. xml格式字符串转为Map

    import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom ...

  2. json格式的字符串转为json对象遇到特殊字符问题解决

    中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 va ...

  3. DataTable转json字符串,jQuery.parseJSON()把json字符串转为标准的json对象格式

    1.string res = DataTableToJson.DataTable2Json(dt);讲DataTable转换为json字符串 http://www.365mini.com/page/j ...

  4. Java中将字符串转为驼峰格式

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:Java中将字符串转为驼峰格式: 使用CaseUtils 对Java字符串进行转换为驼峰格式: CaseUtils.toCamelCas ...

  5. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  6. Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

    由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...

  7. JSON字符串转为JSON对象

    在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是对象,所以,JSON对象(js对象)和JSON字符串之间的相互转换是关键. JSON可以有两种格式,一种是对象格式的,另一种是数 ...

  8. (转)WebApi返回Json格式字符串

    原文地址:https://www.cnblogs.com/elvinle/p/6252065.html WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉 ...

  9. json字符串转为json对象-jQuery.parseJSON()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. Python学习日记(九) 装饰器函数

    1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...

  2. javascript_19-DOM初体验

    DOM DOM: 文档对象模型(Document Object Model),又称为文档树模型.是一套操作HTML和XML文档的API. DOM可以把HTML和XML描述为一个文档树.树上的每一个分支 ...

  3. git学习记录--标签随笔

    创建标签: 命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a <tagname> -m "b ...

  4. three.js展示三维模型

    1.概要 最近学习Three.js,尝试加载一些3d max导出的obj.stl模型,在展示模型的时候遇到了一些问题,模型的尺寸.位置和旋转角度每次都靠手工调整,非常的不方便,就想着写一个方法来随心所 ...

  5. python判断目录或者文件

    1. 判断目录是否存在 'isdir',删除目录时只有该目录为空才可以 'rmdir' import os if(os.path.isdir('D:/Python_workspace/spyder_s ...

  6. 使用Cloudera Manager部署oozie

    使用Cloudera Manager部署oozie 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.进入CM服务安装向导 2>.选择要添加的oozie服务 3> ...

  7. PTA-多项式A除以B

    多项式A除以B 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一个非零多项式,先给出A, ...

  8. STL详细介绍(更新中~~~)

    目录 string string的常见构造函数 string与char *(或const char*)之间的转换 string 转化为const char* const char* 转化为string ...

  9. 使用docker 安装 LNMP

    centos7 下 使用docker 安装 LNMP 一.安装 mysql 1 获取 mysql 镜像 docker pull mysql:5.7 2 创建mysql的镜像,并运行 docker ru ...

  10. 剑指Offer(二十四):二叉树中和为某一值的路径

    剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...