二叉树的建立及其前中后序遍历

//二叉树存储结构:
struct node
{
    Int data;
    node *lchild;
    node *rchild;
};

//二叉树在建树前根节点不存在:
Node *root = NULL;

//新建结点:
node *newNode(int v)
{
    node *Node = new node;
    Node->data = v;
    Node->lchild = NULL;
    Node->rchild = NULL;
    return Node;
}

//二叉树结点的查找、修改:
void search(node *root,int x,int newdata) // 在这里修改的是root指针指向的内容,所以不需要加引用&
{
    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) // 这里要加引用,是因为修改的是root指针本身 
{
    if(root == NULL)
    {
        root = newNode(x);
        return root;
    }
    if(x<=root->data)   // 生成二叉查找树 
        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;    
}

 

 

 

二叉树的遍历:
遍历方法一般有四种,先序遍历、中序遍历、后序遍历、层次遍历,前三种的前中后指的是根结点root在遍历中的位置。

 

void preorder(node *root) // 对于先序遍历,序列第一个一定是根结点 
{
    if(root==NULL)
        return;
    cout << root->data;
    preorder(root->lchild);
    preorder(root->rchild);
}

void inorder(node *root) //中序遍历总把根结点放在左子树和右子树中间 
{
    if(root==NULL)
        return;    
    inorder(root->lchild);
    cout << root->data;
    inorder(root->rchild);
} 

void postorder(node *root) //后序遍历中的序列最后一个一定是根结点 
{
    if(root==NULL)
        return;
    postorder(root->lchild);
    postorder(root->rchild);
    cout << root->data;
}

void LayerOrder(node *root) //根据题意,原存储结构可能要加入layer记录层数 
{
    queue<node*> q; // 队列中的数据类型是指针,这样可以方便有时层序遍历的时候修改数据    
    q.push(root);
    while(!q.empty())
    {
        node *now = q.front();
        q.pop();
        if(now->lchild!=NULL)
            q.push(now->lchild);
        if(now->rchild!=NULL)
            q.push(now->rchild);
    }
}

 

 

 

 

推论:中序序列可以与先序序列、后序序列、层序序列中的任意一个来构建唯一的二叉树
例如:先序序列和中序序列搭配:

 

node *create(int preL,int preR,int inL,int inR) // preL,preR是先序序列的区间 
{
    if(preL>preR) //先序序列长度小于等于0时,直接返回 
        return NULL;
    node *root = new node;
    root->data = pre[preL];
    int k;
    for(k=inL;i<=inR;++i) { if(in[k]==pre[preL]) break; } int num = k-inL; // num是左子树结点个数 root->lchild = create(preL+1,preL+num,inL,k-1);
    root->rchild = create(preL+num,preL+num+1,k+1,InR);
    return root;
}

 

posted @ 2019-01-11 19:01  KachunYip  阅读(542)  评论(0编辑  收藏  举报