树的一些操作,杂记


//新建结点数据类型 

typedef struct{

    typename data;
    node* lchild;
    node* rchild;



}Node;


//新建树结点 

Node* new_node(int v)
{
    Node* node=new Node;
    node->data=v;
    node->lchild=node->rchild=NULL;

    return node;




}

//查找并修改数据 

void search(Node* root,int x,int  newdata)
{
    if(root==NULL)
    {
        return; //空树,死胡同 

    }

    if(root->data==x)
    {

        root->data=newdata;

    }

    search(root->lchild,x,newdata);
    search(root->rchild,x,newdata);




}

//插入数据 


void  insert(Node* &root,int x)
{
    if(root==NULL)
    {
        root= new_node(x);

        return;     //空树,也就是查找失败,也就是插入位置 

    }


    if(由二叉树的性质,x应该插在左子树)
    {

        insert(root->lchild,x);

    }
    else
    {
        insert(root->rchild,x);


    }




}

//建树 

Node* create(int data[],int n)
{
    Node* root=NULL;

    for(int i=0;i<n;i++) 
    {
        insert(root,data[i]);


    }
    return root;


}

//前序遍历 

void preorder(Node* root)
{
    if(root==NULL)
    {
        return;

    }

    printf("%d",root->data);

    preorder(root->lchild);
    preorder(root->rchild);



}


//层序遍历 

void layerorder(Node* root)
{
    queue<Node*> queue;

    queue.push(root);

    while(!queue.empty())
    {
        Node* now=queue.front();
        queue.pop();


        printf("%d",now->data);


        if(now->lchild!=NULL)
        {
            queue.push(now->lchild);

        }

        if(now->rchild!=NULL)
        {

            queue.push(now->rchild);

        }





    }






}



//加入 层 的树结点。 

struct ndoe{

    int data;   //数据域 
    int layer;  //层次
    node* lchild;
    node* rchild; 


};



//新的层序遍历 

void layerorder(Node* root)
{

    queue<Node*> queue;

    root->layer=1;

    queue.push(root);

    while(!queue.empty())
    {
        Node* now=queue.front();

        queue.pop();

        printf("%d",now->data);

        if(now->lchild!=NULL)
        {

            now->lchild->layer=now->layer+1;
            queue.push(now->lchild);

        }

        if(now->rchild!=NULL)
        {

            now->rchild->layer=now->layer+1;

            queue.push(now->rchild);

        }





    }








}




//已知当前 先序序列 和 中序序列, 返回树的根结点地址。

Node* create(int preL,int preR,int inL,int inR)
{
    if(preL>preR)
    {

        return NULL;

    }

    Node* root=new Node;        //新建一个新的结点,用来保存二叉树的根结点

    root->data=pre[preL];   //新结点的数据域为根结点的值 

    int k;

    //在中序序列中找到in[k] == pre[L]的结点 


    for(k=inL;k<=inR;k++) 
    {
        if(in[k] == pre[preL] )
        {
            break;

        }

    }

    //左子树的结点个数 
    int num_left = k-inL;

    root->lchild=create(prL+1,preL+num_left,inL,k-1);

    root->rchild=create(preL+num_left+1,preR,k+1,inR); 





}