• 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( 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( '' != *++str ){
            pcur = pop(s);
            printf("  pcur->data:%c, val:%c
    ",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
    ");
                }
            }    
        }
        return t;
    }

      测试二叉树:

    void PreOrderTraverse(TreeNode *t){
        //printf("in PreOrderTraverse
    ");
        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("
    ");
        InOrderTraverse(t);
        printf("
    ");
        PostOrderTraverse(t);
        printf("
    ");
            
        char str2[] = "AB##C##";    
        t = creat_tree(str2);    
        PreOrderTraverse(t);
        printf("
    ");
        InOrderTraverse(t);
        printf("
    ");
        PostOrderTraverse(t);
        printf("
    ");
    }

      输出:

    ABDHKECFIGJ
    HKDBEAIFCGJ
    KHDEBIFJGCA

    ABC
    BAC
    BCA

  • 相关阅读:
    线程池的爆掉
    WebApi的调用-1.前端调用
    使用SqlSugar 4.X的T4生成实体类
    JSON.NET 空值处理, 数字转字符,时间格式化
    C#获取路径
    MVC4 下DropDownList使用方法(转)
    14.并发与异步
    14.并发与异步
    14.并发与异步
    VS2013 生成时复制文件或目录到指定目录
  • 原文地址:https://www.cnblogs.com/wbjxxzx/p/4699567.html
Copyright © 2020-2023  润新知