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> ...
随机推荐
- Android ProGuard:代码混淆压缩
写这篇文章的目的 一直以来,在项目中需要进行代码混淆时每次都要去翻文档,很麻烦.也没有像写代码那样记得那么多.既然要查来查去,就不如自己捋一捋这个知识点了,被人写的终究还是别人的.所以自己去翻看了很多 ...
- python 3.7.4 安装 opencv
明确一下,我们需要使用python来调用opencv中的库函数,所以需要安装opencv-python. 主要需要安装: 1. opencv-python 2. numpy 第一步先来安装opencv ...
- 如何通过Restful API的方式读取SAP Commerce Cloud的Product Reference
从SAP官网上找到api的说明: https://api.sap.com/api/commerce_services/resource api endpoint: /rest/v2/electroni ...
- 安装node.js->npm->vue
我们研究vue时,首先操作的就是vue的引用,大部分人为了方便直接在页面上引用vue.js,但是一些大型网站还是比较喜欢用vue的npm命令来安装vue并使用,之前研究vue时,研究过使用npm安装的 ...
- python之变量的数据类型(3)dict 及解构简单介绍
一.变量的数据类型(3) 1. dict 字典dict 用{}来表示 键值对数据 {key:value} 唯一性 键 都必须是可哈希的 不可变的数据类型就可以当做字典中的键 值 没有任何限制 2.增删 ...
- Wireshark 分析Linux SSh 远程登录延迟问题
1.PuTTy远程登录延迟的分析 现象问题描述:在使用kali linux 的时候喜欢在后台运行而在Windows主机系统上安装PuTTY来实现远程登录 发现每次输入密码的时候会存在延迟10s的情况, ...
- linux网络编程之socket编程(四)
经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...
- P1559 运动员最佳匹配问题[最大费用最大流]
题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...
- 均分纸牌(Noip2002)
1320:[例6.2]均分纸牌(Noip2002) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 3537 通过数: 1839 [题目描述] 有n堆纸牌,编 ...
- Tomcat8服务
Windows部署Tomcat8服务在windows上部署Tomcat服务后,可以将Tomcat设为开机启动,即开机后Tomcat就会自动运行.这样就不用每次进到Tomcat的bin目录双击start ...