如何构建一棵二叉树(已知前序顺序,带#号)

伪代码:

分析  

二叉树顺序为:ABDF####C#E#G

     利用前序来做

二叉树的根节点  CreateTree(char   preorder[],  int size){

用掉的数目

 //根

   Node *root=malloc(preorder[0])

                   //左子树  &preorder[1],size-1

根,左用掉=CreateTree(左子树的前序,左子树前序的长度);

 

//右子树 preorder+1+左用掉(7)   ,  size-1-左用掉(7)

CreateTree(右子树的前序,右子树前序的长度);

右根,右用掉

   Return root,1+左用掉+右用掉

代码如下:

    CreateTree.h

//方法一:
Node * CreateTree(char preorder[], int size,int *used){
    if (size == 0){
        *used = 0;
        return  NULL;
    }
    if (preorder[0] == '#'){
        *used = 1;
        return NULL;
    }
    Node *root =(Node *) malloc(sizeof(Node));
    root->value = preorder[0];
    
    int leftUsed;
    root->left= CreateTree(preorder + 1, size - 1,&leftUsed);

    
    int rightUsed;
    root->right= CreateTree(preorder + 1+leftUsed, size - 1-leftUsed,&rightUsed);
    *used = 1 + leftUsed + rightUsed;
    return root;
}
//方法二:结构体
typedef struct Result{
    struct Node *root;
    int used;
}Result;

Result  CreateTree1(char preorder[], int size){
    Result r;
    if (size == 0){
        r.root = NULL;
        r.used =NULL;
        return  r;
    }
    if (preorder[0] == '#'){
        r.root = NULL;
        r.used = 1;
        return r;
    }


    Node *root = (Node *)malloc(sizeof(Node));
    root->value = preorder[0];


    Result leftR = CreateTree1(preorder + 1, size - 1);
    Result rightR = CreateTree1(preorder + 1 + leftR.used, size - 1 - leftR.used);

    root->left = leftR.root;
    root->right = rightR.root;

    r.root = root;
    r.used = 1 + leftR.used + leftR.used;
    return r;
}
int preOrder(Node *root){
    if (root == NULL){
        return NULL;
    }
    printf("%d ", root->value);
    preOrder(root->left);
    preOrder(root->right);

}
void test3(){
    char *preorder = "ABDF####C#E#G";
    int size = strlen(preorder);
    int used;
    Node *root = CreateTree( preorder,  size, &used);
    preOrder(root);
}

CreateTree.c

int main(){
    test3();
}

 

你可能感兴趣的:(数据结构)