最近在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

最新文章

  1. 实验环境里新创建成功的web application却在浏览器中返回404错误
  2. 【python cookbook】【数据结构与算法】2 从任意长度的可迭代对象中分解元素
  3. javaSE基础之记事本编程
  4. Web用户自定义控件
  5. 将CString(unicode)转换为char*(ANSI)
  6. 【原创】Android 从一个Activity跳转到另外一个Activity
  7. Eclipse用法和技巧十九:eclipse修改workspace
  8. java验证手机号码是否合法
  9. ITest
  10. 【读书笔记】【深入理解ES6】#9-JavaScript中的类
  11. 国内不谈java
  12. NIO 多线程
  13. captcha.js一个生成验证码的插件,使用js和canvas生成
  14. uninitialized_copy()效果试验
  15. python遇到的知识点
  16. CSS弹性盒布局(display:flex)
  17. Javascript深入理解构造函数和原型对象
  18. APP端上传图片 - php接口
  19. 深入出不来nodejs源码-内置模块引入再探
  20. chrome安装HTTP测试扩展

热门文章

  1. mysql 的使用
  2. PHP传引用/作用域 问题
  3. mybatis中对数据表操作的四种语法
  4. Virtualization and Performance: Understanding VM Exits
  5. centos7小命令
  6. linux 利用LDAP身份集中认证
  7. 浅谈OpenStack与虚拟机的区别与联系
  8. Codeforces H. Maximal GCD(贪心)
  9. Java精通并发-透过字节码理解synchronized关键字
  10. Kotlin编译器优化与when关键字详解