zoukankan      html  css  js  c++  java
  • 二叉树的建立及其前中后序遍历

    //二叉树存储结构:
    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;
    }
  • 相关阅读:
    js之数组的方法
    js之选项卡
    js之数据类型的比较
    Android sharedUserId研究记录
    直接拿来用!最火的Android开源项目(一)
    [转]简约而不简单——Android SimpleAdapter
    [转]Android GC机制及一些调试信息
    sendToTarget 和 sendMessage 区别
    Android中内容观察者的使用---- ContentObserver类详解 (转)
    Inflate()
  • 原文地址:https://www.cnblogs.com/kachunyippp/p/10256793.html
Copyright © 2011-2022 走看看