2019-09-05 将二叉树完全静态化

struct node{
    typename data;
    node* lchild;
    node* rchild;
}node[maxn];

//节点的动态生成可以变为静态指定:

int index = 0;
int newNode(int v){
    node[index].data = v;
    node[index].lchild = -1;
    node[index].rchild = -1;
    return index++;
} 

//二叉树查找

void search(int root, int x, int newdata){
    if(root == -1){
        //用-1来代表空树 
        return ;
        //空树,死循环(递归边界) 
    }
    if(node[root].data == x){
        node[root].data = newdata;
        //如果找到数据域为x的节点,把他修改为newdata 
    } 
    search(node[root].lchild, x, newdata);
    search(node[root].rchild, x, newdata); 
} 

//插入,root为根节点在数组中的下标

void insert(int &root, int x){
    //记得加引用
    if(root == -1){
        //空树,说明查找失败,这里就是插入位置(递归边界)
        root = newNode(x);
        return ; 
    } 
    if(由二叉树性质x应插在左子树)
        insert(node[root].lchild, x);
    else{
        insert(node[root].rchild, x);
    } 
}

//二叉树的建立,函数返回根节点root的下标

int create(int data[], int n){
    int root = -1;
    for(int i = 0; i < n; i++){
        insert(root, data[i]);
        //将data[0]~data[n-1]插入二叉树中; 
    }
    return root;
} 

二叉树的前序中序后序层序遍历

//前序
void preorder(int root){
    if(root == -1)
        return ;
        //到达空树,递归边界
    //访问根节点root,比如操作:将根节点输出
    printf("%d\n", node[root].data);
    //访问左子树
    preorder(node[root].lchild);
    //访问右子树
    preorder(node[root].rchild); 
} 

//中序
void inorder(int root){
    if(root == -1){
        return ;
    }
    inorder(node[root].lchild);
    printf("%d\n", node[root].data);
    inorder(node[root].rchild);
} 

//后序
void postorder(int root){
    if(root == -1)
        return ;
    postorder(node[root].lchild);
    postorder(node[root].rchild);
    printf("%d\n", node[root].data);
} 

//层序遍历

void layerorder(int root){
    queue q;
    //此处队列里放节点的下标 
    q.push(root);
    //将根节点地址入队
    while(!q.empty()){
        int now = q.front();
        q.pop();
        printf("%d ", node[now].data);
        //取出队首元素并访问
        if(node[now].lchild != -1)
            q.push(node[root].lchild);
            //左子树非空
        if(node[now].rchild != -1)
            q.push(node[root].rchild);
            //右子树非空 
    } 
} 

你可能感兴趣的:(2019-09-05 将二叉树完全静态化)