二叉树的基本操作

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: c++,先序遍历,中序遍历,后序遍历
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;

const int N=100;
typedef struct edge* node;

struct edge
{
    char data;
    node l;
    node r;
};

//通过先序序列和中序序列构造二叉树 
node insert(char *a, char *b, int n)
{
    int i;
    int n1=0, n2=0;
    int m1=0, m2=0;
    char la[N], ra[N];
    char lb[N], rb[N];
    node BT=NULL;
    if(n==0)
        return NULL;
    BT=(node) malloc(sizeof(struct edge));
    if(!BT)
        return NULL;
    memset(BT,0,sizeof(edge));
    BT->data=a[0];
    for(i=0;i<n;i++)
    {
        if(i<=n1&&(b[i]!=a[0]))
            lb[n1++]=b[i];
        else if(b[i]!=a[0])
            rb[n2++]=b[i];
    }
    for(i=1;i<n;i++)
    {
        if(i<=n1)
            la[m1++]=a[i];
        else
            ra[m2++]=a[i];
    }
    BT->l=insert(la, lb, n1);
    BT->r=insert(ra, rb, n2);
    return BT;
}

//通过后序序列和中序序列构造二叉树 
node push(char *a, char *b, int n)
{
    int i;
    int n1=0, n2=0;
    int m1=0, m2=0;
    char la[N], ra[N];
    char lb[N], rb[N];
    node BT=NULL;
    if(n==0)
        return NULL;
    BT=(node) malloc(sizeof(struct edge));
    if(!BT)
        return NULL;
    memset(BT,0,sizeof(edge));
    BT->data=a[n-1];
    for(int i=0;i<n;i++)
    {
        if(i<=n1&&(b[i]!=a[0]))
            lb[n1++]=b[i];
        else if(b[i]!=a[0])
            rb[n2++]=b[i];
    }
    for(i=0;i<n-1;i++)
    {
        if(i<=n1)
            la[m1++]=a[i];
        else
            ra[m2++]=a[i];
    }
    BT->l=push(la, lb, n1);
    BT->r=push(ra, rb, n2);
    return BT;
}

//先序遍历 
void Preorder(node BT)
{
    if(BT==NULL)
        return;
    printf("%c ", BT->data);
    Preorder(BT->l);
    Preorder(BT->r);
}

//非递归的先序遍历 
//void 

//中序遍历
void Inorder(node BT)
{
    if(BT==NULL)
        return;
    Inorder(BT->l);
    printf("%c ", BT->data);
    Inorder(BT->r);
}

//非递归的中序遍历
//void

//后序遍历
void Postorder(node BT)
{
    if(BT==NULL)
        return;
    Postorder(BT->l);
    Postorder(BT->r);
    printf("%c ", BT->data);
}

//非递归的后序遍历 
//void 

//层序遍历
void  Traversal(node BT)
{
    queue<char> q;
    if(!BT) return;
    q.push(BT->data);
    while(q.size())
    {
        printf("%c ", q.front());
        q.pop();
        if(BT->l) q.push(BT->l->data);
        if(BT->r) q.push(BT->r->data);
    }
}

//计算二叉树树高 
int high(node BT)
{
    if(BT)
    {
        int hl=high(BT->l);
        int hr=high(BT->r);
        int maxh=(hl>hr)?hl:hr;
        return maxh+1;
    }
    else return 0;
}

//输出二叉树的叶子结点 
void yezi(node BT)
{
    if(BT)
    {
        if(!BT->l&&!BT->r) 
            printf("%c ", BT->data);
        yezi(BT->l);
        yezi(BT->r);
    } 
} 


int main()
{
    int n;
    char a[N], b[N];
    node BT;
    BT=NULL;
    scanf("%d", &n);
    getchar();
    for(int i=0;i<n;i++)
        scanf("%c", &a[i]);
    getchar();
    for(int i=0;i<n;i++)
        scanf("%c", &b[i]);
    BT=insert(a, b, n);
    int t=high(BT);
    printf("%d\n", t);
    return 0;
} 
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
存储 算法
链式二叉树的基本操作实现(建议收藏!!!)(2)
链式二叉树的基本操作实现(建议收藏!!!)
98 0
|
存储 算法
二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
78 0
|
6月前
|
存储 算法
数据结构实验(四)二叉树的基本操作
数据结构实验(四)二叉树的基本操作
|
6月前
|
存储
二叉树的基本概念以及基本操作
二叉树的基本概念以及基本操作
72 2
链式二叉树的基本操作实现(建议收藏!!!)(3)
链式二叉树的基本操作实现(建议收藏!!!)
37 0
链式二叉树的基本操作实现(建议收藏!!!)(1)
链式二叉树的基本操作实现(建议收藏!!!)
56 0
|
存储 机器学习/深度学习 Java
数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)
4.1.树 树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件: 任何结点的子节点不相交。 任何子结点只有一个父节点。 N个结点,N-1条边。 对于一个非空树(结点数≥0),具有以下性质: 起始结点称为“根” 除根结点外可分为m个互不相交的有限集合,其中每个集合本身也是一棵树,称为原来这棵树的“子树”。
144 0
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
《Java数据结构》二叉树的这些基本操作你真的理解了吗
《Java数据结构》二叉树的这些基本操作你真的理解了吗