C格式字符串转为二叉树
最近在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格式字符串转为二叉树的更多相关文章
- xml格式字符串转为Map
import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom ...
- json格式的字符串转为json对象遇到特殊字符问题解决
中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 va ...
- DataTable转json字符串,jQuery.parseJSON()把json字符串转为标准的json对象格式
1.string res = DataTableToJson.DataTable2Json(dt);讲DataTable转换为json字符串 http://www.365mini.com/page/j ...
- Java中将字符串转为驼峰格式
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:Java中将字符串转为驼峰格式: 使用CaseUtils 对Java字符串进行转换为驼峰格式: CaseUtils.toCamelCas ...
- WebApi返回Json格式字符串
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...
- Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法
由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...
- JSON字符串转为JSON对象
在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是对象,所以,JSON对象(js对象)和JSON字符串之间的相互转换是关键. JSON可以有两种格式,一种是对象格式的,另一种是数 ...
- (转)WebApi返回Json格式字符串
原文地址:https://www.cnblogs.com/elvinle/p/6252065.html WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉 ...
- json字符串转为json对象-jQuery.parseJSON()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- linux kernel相关学习资料的收集与周边
<<linux内核设计与实现>>读了一遍.穿线作用比较好. 收获一个网站,和三本书 https://kernelnewbies.org/ https://book.douban ...
- Python_列表操作2
1.使用sort()方法对列表进行永久性排序: colorsList=['hong','cheng','huang','lv'] colorsList.sort() #正序排序 print(color ...
- 190919 python水仙花数
# 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,# 其各位数字立方和等于该数本身.例如:153是一个"水仙花数",# 因为15 ...
- pipeline和channel的区别
pipeline和channel的区别 在golang中,学到channel时,往往都会产生一些疑惑,和channel的区别是什么? 以下就是区别: difference channel pipeli ...
- 2013.6.21 - OpenNER第一天
下午去实验室继续写实验报告,跟伟杰要了一个实验报告,然后大师兄叫我,我们在走廊唠了一会儿. 大 师兄想做Open NE,他说这个会比较难,目前没有人做,因为还没有发现相关的文章,大家研究的都是指定了哪 ...
- BZOJ3277 串 和 BZOJ3473 字符串
字符串 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 分析 参照自为风月马前卒和Candy?的题解. 广义后缀自动机不就是把很多串的SAM建到了一个S ...
- 【IT】在线技术工具
1.IP地址查询: (1)http://www.ip138.com/ 注:可查询此IP地址的服务器归属地 (2)https://x.threatbook.cn/ 注:可查询域名.ip等的反查域名 2.
- linux中service模板
[Unit] Description=描述 After=syslog.target network.target remote-fs.target nss-lookup.target [Service ...
- car配置篇
这没有什么好说的 1.5t的涡轮增压 CVT(Continuously Variable Transmission)技术即无级变速技术,它采用传动带和工作直径可变的主.从动轮相配合来传递动力,可以实现 ...
- C++语言第一课的学习
// HelloApp.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...