C格式字符串转为二叉树
2015-08-03 15:56
369 查看
最近在LeetCode做题,二叉树出现错误时不好排查,于是自己写了一个函数,将前序遍历格式字串转换成二叉树。
形如 "AB#D##C##" 的字符串,"#"表示孩子节点为空,算法如下:
1.当前节点进栈 push(s,t)
2.出栈: pcur=pop(s) ,判断当前字符
a 不等于'#',申请新的节点pnew并赋给pcur的左或右孩子,当右孩子时将标记置真,pcur进栈,pnew进栈
b 等于'#',如果当前为左孩子,左孩子置null,pcur进栈;
当前为右孩子,右孩子置空,父节点出栈。如果pcur是父节点的左孩子,终止寻找;否则保存父节点为当前节点,继续寻找。
代码如下:
测试二叉树:
输出:
ABDHKECFIGJ
HKDBEAIFCGJ
KHDEBIFJGCA
ABC
BAC
BCA
形如 "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( 0 == 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
相关文章推荐
- Leetcode-102(Java) Binary Tree Level Order Traversal
- Selenium2学习-028-WebUI自动化实战实例-026-获取页面元素值或者元素属性值
- Memblaze发布PBlaze 4系列PCIe SSD新品 全面拥抱 NVMe
- UVA 537 Artificial Intelligence?
- markdown语法学习
- C#高级编程六十七天----LINQ提供程序
- 文字反排unicode-bidi、direction
- java动态代理详解
- Hadoop入门进阶课程8--Hive介绍和安装部署
- Android学习中ADT创建工程后出现appcompat_V7包和自定义包异常处理方法(文章转移)
- json.stingIfy()和json.parse()区别
- GIT 代码自动部署
- 【Unity NGUI游戏开发之六】游戏背景采用UV纹理动画
- 使用pinyin4j
- HDU - 4289 Control (最小割 MCMF)
- LeetCode(80) Remove Duplicates from Sorted Array II
- c#值得注意的基础知识点3.49
- [初学嵌入式]完全没有接触过linux也可以轻松玩转4412开发板
- Spring4 MVC 笔记: ControllerClassNameHandlerMapping 实现DispatcherServlet
- HTML5 Canvas实现图片擦除效果