二叉树

简单总结一下,树的一些操作

一:树的遍历

1、前序遍历:访问该节点,然后访问该节点的左子树和右子数

代码:

递归实现:

void preOrder(link h, void (*visit)(link))
{
    if(h == NULL)
        return;
    (*visit)(h);
    preOrder(h->left,visit);
    preOrder(h->right,visit);
}
非递归实现:

void preOrder(link h, void (*visit)(link))
{
    stack<int> s(max);
    s.push(h);
    while(!s.empty())
    {
        (*visit)(s.top());
        s.pop();
        if(h->r != NULL) s.push_back(h->r);
        if(h->l != NULL) s.push_back(h->l);
    }
}

2、中序遍历:先访问该节点的左子树,再访问该节点,最后访问该节点的右子树

代码:

递归实现

void inOrder(link h, void (*visit)(link))
{
    if(h == NULL)
        return;
    
    inOrder(h->l, visit);
    (*visit)(h);
    inOrder(h->r, visit);
}

3、后序遍历:先访问节点的左子树,再访问节点的右子树,最后访问该节点

代码:

void postOrder(link h, void (*visit)(link))
{
    if(h == NULL)
        return;
    postOrder(h->l, visit);
    postOrder(h->r, visit);
    (*visit)(h);
}

4、层序遍历:一层一层访问节点,从上到下,从左到右

代码:

void level(link h, void (*visit)(link))
{
    queue<int> q(max);
    queue.push(h);
    while(!q.empty())
    {
        (*visit)(q.top());
        q.pop();
        if(h->l != NULL) q.push(h->l);
        if(h->r != NULL) q.push(h->r);
    }
}


二:二叉树的几个应用

1、由前序和中序、后序构建二叉树

前序和中序可以唯一确定二叉树、后序和中序也可以唯一确定二叉树、前序和后序不能唯一确定一颗二叉树

由前序和中序构建二叉树

代码:

#define maxN 1000
int mapIndex[maxN];
void mapToIndex(int inorder[], int n)
{
    for (int i=0; i<n; i++)
    {
        mapIndex[inorder[i]] = i;                                   //中序排列中,节点的位置
    }
}

binarynode* buildInorderPreorder(int pre[], int n, int begin)      //pre为前序数组中子数开始的起始指针,n 为节点数,begin为子树开始位置,初始为0;
{
    if (n == 0)
        return NULL;
    int rootVal = pre[0];
    int i = mapIndex[rootVal] - begin;                              //节点个数
    binarynode* root = newNode(rootVal);
    root->left = buildInorderPreorder(pre+1, i, begin);
    root->right = buildInorderPreorder(pre+i+1, n-i-1, begin+i+1);
    
    return root;
}

后序和中序

binarynode *buildInorderPostorder(int post[], int n, int begin)
{
    if (n == 0) 
        return NULL;
    int rootVal = post[n-1];
    int i = mapIndex[rootVal]-begin;
    binarynode *root = newNode(rootVal);
    root->left = buildInorderPostorder(post, i, begin);
    root->right = buildInorderPostorder(post+i, n-i-1, begin+i+1);
  
    return root;
}


2、二叉搜索树

binary serch tree,BST:他的每一个节点关键字具有以下性质:任意节点关键字都大于(或等于)该节点的左子树中所有节点的关键字,小于(或)等于该节点右子树所有关键字

二叉搜索树一些常用操作

代码:

typedef struct STnode* link;
struct STnode
{
    int item;
    link l,r;
    int N;                //节点个数
}
static link head, z;
link NEW(int item, link l, link r, int N)
{
    link x = new(sizeof *x);
    x->item = item;
    x->l = l;
    x->r = r;
    x->N = N;
    return x;
}

void STinit()
{
    head = (z = NEW(NULLitem, 0, 0, 0));
}

int STcount()
{
    return head->N;
}

int searchR(link h, int v)
{
    int t = h->item;
    if(h == z)
        return NULLitem;
    if(v == t)
        return h->item;
    if(v < t)
        return searchR(h->l,v);
    else
        return searchR(h->r,v);
}

int STsearch(int v)
{
    return searchR(head,v);
} 

link insertR(link h, int v)
{
    if(h == z)
        return NEW(item,z,z,1);
    if(v < h->item)
        h->l = insertR(h->l,v)
    else
        h->r = insertR(h->r,v);
    (h->N)++;
    return h;
}

void STinsert(int item)
{
    head = insertR(head,item);
}
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值