二叉树及其应用--二叉树的应用

来源:互联网 发布:知乎 日韩军力对比 编辑:程序博客网 时间:2024/05/21 10:07

二叉树带节点数输出
给出二叉树的先序遍历输出(空结点用’.’)表示,请构造二叉树,并输出二叉树的广义表表示,此广义表中每个结点均带有一个整数,这个整数表示对应的子树上结点总数。

输入说明:
一行仅由‘.’与大小写字符构成的字符串,该字符串表示二叉树的前序遍历输出,其中’.’表示空结点,字符串长度不超过100。
输出说明:
在单独一行中二叉树的广义表表示,此广义表中每个结点均带有一个整数,这个整数表示对应的子树上结点总数。具体格式参考输出样例。
输入样列:
ABD…C..
输出样列:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>#include <cctype>using namespace std;#define N 100typedef char Element;struct Node{    Element data;    int num;    struct Node *lchild;    struct Node *rchild;};typedef struct Node BTNode;typedef struct Node * BTree;BTree Create_BTree();BTree NewNode(Element x);void PrintBTreeNum(BTree root);void Pre_Order(BTree root);int GetNum(BTree root);int main(){    BTree root;    root=Create_BTree();    Pre_Order(root);    PrintBTreeNum(root);    printf("\n");    return 0;}BTree NewNode(Element x){    BTree p=(BTree)malloc(sizeof(BTNode));    p‐>data=x;    p‐>lchild=NULL;    p‐>rchild=NULL;    return p;}BTree Create_BTree(){    BTree root;    char c;    c=getchar();    if(c=='.')        return NULL;    root=NewNode(c);    root‐>lchild=Create_BTree();    root‐>rchild=Create_BTree();    return root;}void Pre_Order(BTree root){    if(root!=NULL)    {        root‐>num=GetNum(root);        Pre_Order(root‐>lchild);        Pre_Order(root‐>rchild);    }}int GetNum(BTree root){    int num;    if(root==NULL)        return 0;    num=1;    if(root‐>lchild!=NULL)        num+=GetNum(root‐>lchild);    if(root‐>rchild!=NULL)        num+=GetNum(root‐>rchild);    return num;}void PrintBTreeNum(BTree root){    if(root==NULL);    printf("%c[%d]",root‐>data,root‐>num);    if(root‐>lchild==NULL&&root‐>rchild==NULL);    printf("(");    if(root‐>lchild!=NULL)        PrintBTreeNum(root‐>lchild);    printf(",");    if(root‐>rchild!=NULL)        PrintBTreeNum(root‐>rchild);    printf(")");}

二叉树树状输出I
给出二叉树的先序遍历输出(空结点用’.’)表示,请构造二叉树,并按树状输出该二叉树(竖向)。

输入说明:
一行仅由‘.’与大小写字符构成的字符串,该字符串表示二叉树的前序遍历输出,其中’.’表示空结点,字符串长度不超过100。
输出说明:
输出有若干行,为二叉树的树状输出(竖向),具体格式参考输出样例,为明显起见,输出中用”代替空格。在你的程序用,也请用”代替空格。
输入样列:
ABD…C..
输出样列:
-C
A
-B
–D

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>#include <cctype>using namespace std;#define N 100typedef char Element;struct Node{    Element data;    int num;    struct Node *lchild;    struct Node *rchild;};typedef struct Node BTNode;typedef struct Node * BTree;BTree Create_BTree();BTree NewNode(Element x);void PrintBTreeShape(BTree root,int layer);int main(){    BTree root;    root=Create_BTree();    PrintBTreeShape(root,0);    return 0;}BTree NewNode(Element x){    BTree p=(BTree)malloc(sizeof(BTNode));    p‐>data=x;    p‐>lchild=NULL;    p‐>rchild=NULL;    return p;}BTree Create_BTree(){    BTree root;    char c;    c=getchar();    if(c=='.')        return NULL;    root=NewNode(c);    root‐>lchild=Create_BTree();    root‐>rchild=Create_BTree();    return root;}void PrintBTreeShape(BTree root,int layer){    int i;    if(root==NULL);    PrintBTreeShape(root‐>rchild,layer+1);    for(i=0;i<layer;i++)        printf("‐");    printf("%c\n",root‐>data);    PrintBTreeShape(root‐>lchild,layer+1);}

二叉树树状输出II
给出二叉树的先序遍历输出(空结点用’.’)表示,请构造二叉树,并按树状输出该二叉树(横向)。

输入说明:
一行仅由‘.’与大小写字符构成的字符串,该字符串表示二叉树的前序遍历输出,其中’.’表示空结点,字符串长度不超过100。
输出说明:
输出有若干行,为二叉树的树状输出(横向),具体格式参考输出样例,为明显起见,输出中用”代替空格。在你的程序用,也请用”代替空格。
输入样列:
ABD…C..
输出样列:
–A
-B-C
D

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>#include <cctype>using namespace std;#define N 1000int m=0,n=0;int p=0,q=0;char b[100][100];char c[100][100];int f=0;typedef char Element;struct Node{    int num;    Element data;    struct Node *lchild;    struct Node *rchild;};typedef struct Node BTNode;typedef struct Node * BTree;BTree Create_BTree(char s[]);void PrintBTree(BTree root,int large);int GetNum(BTree root);int isp(char k);BTree Create_BTree(){    char a;    BTree T;    scanf("%c",&a);    if(a=='.')    T=NULL;    else    {        T=(BTree )malloc(sizeof(BTNode));        T‐>data=a;        T‐>lchild=Create_BTree();        T‐>rchild=Create_BTree();    }    return T;}void PrintBTree(BTree root,int large){    if(root==NULL);    PrintBTree(root‐>rchild,large+1);    for(int i=0;i<large;i++)    {        b[m][n]='‐';        n++;    }    b[m][n]=root‐>data;    if(f<n)        f=n;    n=0;    m++;    PrintBTree(root‐>lchild,large+1);}int judge(int i,int j){    int w,e=0;    for(w=j;w<100;w++)        if (isp(c[i][w])==1)            e++;    if (e!=0)        return 0;    return 1;}int isp(char k){    if (k>='a'&&k<='z')        return 1;    if (k>='A'&&k<='Z')        return 1;    return 0;}void work(int x){    for(int i=0;i<x;i++)    for(int j=0;j<m;j++)    if(isp(c[i][j‐1])==1&&c[i][j]=='‐')        c[i][j]='\0';    for(int i=0;i<x;i++)        for(int j=0;j<m;j++)            if(c[i][j]=='\0')                c[i][j]='‐';}int main(){    char s[N];    int i,j;    BTree root=NULL;    root=Create_BTree();    PrintBTree(root,0);    for(j=0;j<=f;j++)    {        for (i=m‐1;i>=0;i‐‐)        {            c[p][q]=b[i][j];            q++;        }         q=0;        p++;    }     work(f+1);    for(i=0;i<p;i++)    {        for(j=0;c[i][j]!='\0';j++)            if(judge(i,j)==0||c[i][j]!='‐')                printf("%c",c[i][j]);            printf("\n");    }     return 0;}

二叉树确定
给定一个二叉树的前序和中序遍历,确定二叉树并输出二叉树的后序遍历。

输入说明:
输入仅两行,这两行均是长度为n的字符串,分别表示一颗二叉树的前序和中序遍历。n<200
输出说明:
在单独一行中输出该二叉树的后序遍历。
输入样列:
abdfgceh
fdgbache
输出样列:
fgdbheca

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>#include <cctype>using namespace std;#define N 100typedef char Element;struct Node{    Element data;    struct Node *lchild;    struct Node *rchild;};typedef struct Node BTNode;typedef struct Node * BTree;BTree Create_BTree(char per[],int s1,int e1,char in[],int s2,int e2);BTree NewNode(Element x);void _Order(BTree root);int Find(char in[],int start,int end,char x){    int i;    for(i=start;i<=end;i++)        if(in[i]==x)            return i;    return1;}int main(){    char pre[201],in[201];    gets(pre);    gets(in);    BTree root;    int n=strlen(in);    root=Create_BTree(pre,0,n‐1,in,0,n‐1);    _Order(root);    printf("\n");    return 0;}BTree NewNode(Element x){    BTree p=(BTree)malloc(sizeof(BTNode));    p‐>data=x;    p‐>lchild=NULL;    p‐>rchild=NULL;    return p;}BTree Create_BTree(char pre[],int s1,int e1,char in[],int s2,int e2){    int k;    BTree root=NewNode(pre[s1]);    k=Find(in,s2,e2,pre[s1]);    if(k!=s2)        root‐>lchild=Create_BTree(pre,s1+1,s1+(k‐s2),in,s2,k‐1);    if(k!=e2)        root‐>rchild=Create_BTree(pre,s1+(k‐s2)+1,e1,in,k+1,e2);    return root;}void _Order(BTree root){    if(root!=NULL)    {        _Order(root‐>lchild);        _Order(root‐>rchild);        printf("%c",root‐>data);    }}

表达式树
给定一个表达式的后缀表示,请构造一个表达式树,并输出该表达式树的前序和中序遍历。

输入说明:
输入仅一行,改行表示一个表达式的后缀表示。
输出说明:
输入为两行,分别表示该表达式树的前序和中序遍历
输入样列:
ab+cde+**
输出样列:
*+ab*c+de
a+b*c*d+e

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>#include <cctype>#include <stack>using namespace std;#define N 100typedef char Element;struct Node{    Element data;    struct Node *lchild;    struct Node *rchild;};typedef struct Node BTNode;typedef struct Node * BTree;BTree Create_BTree(char t[]);BTree NewNode(Element x);void Pre_Order(BTree root);void In_Order(BTree root);bool IsOpetator(char a);int main(){    char t[201];    gets(t);    BTree root;    root=Create_BTree(t);    Pre_Order(root);    printf("\n");    In_Order(root);    printf("\n");    return 0;}BTree NewNode(Element x){    BTree p=(BTree)malloc(sizeof(BTNode));    p‐>data=x;    p‐>lchild=NULL;    p‐>rchild=NULL;    return p;}bool IsOperator(char a){    if(a=='+'||a=='‐'||a=='*'||a=='/')        return true;    else        return false;}BTree Create_BTree(char t[]){    stack<BTree> s;    BTree p=NULL;    int i;    for(i=0;t[i]!='\0';i++)    {        p=NewNode(t[i]);        if(IsOperator(t[i]))        {            p‐>rchild=s.top();            s.pop();            p‐>lchild=s.top();            s.pop();        }         s.push(p);    }     p=s.top();    return p;}void Pre_Order(BTree root){    if(root!=NULL)    {        printf("%c",root‐>data);        Pre_Order(root‐>lchild);        Pre_Order(root‐>rchild);    }}void In_Order(BTree root){    if(root!=NULL)    {        In_Order(root‐>lchild);        printf("%c",root‐>data);        In_Order(root‐>rchild);    }}
0 0
原创粉丝点击