还原二叉树(求高度并输出二叉树)

目录

举一个例子:

求最大高度

先序遍历

树的层序遍历

解析:


在还原二叉树的过程中,我们必须明确中序遍历的结果才能进行

举一个例子:

已知后序遍历结果和中序遍历结果:

(依据后序从后往前的结果为根节点开始划分)

还原二叉树(求高度并输出二叉树)_第1张图片

 例题: 

题目详情 - 7-1 还原二叉树 (pintia.cn)

(前序和中序)

求最大高度

#include
using namespace std;

const int N=55;
char pre[N],inoder[N];
int n,h;

typedef struct Binode{
    int elem;
    Binode*lchild,*rchild;
}Binode;

Binode*creatheap(char pre[],char in[],int N){
    if(N<=0)
    return NULL;
    Binode*T1=new Binode;
    int i=0;
    T1->elem=pre[0];
    while(ilchild=creatheap(pre+1,in,i);
    T1->rchild=creatheap(pre+i+1,in+i+1,N-i-1);
    return T1;
}

int  heap(Binode*T){
     if(T==NULL) return 0; 
    else  
    { 
        int m = heap(T->lchild); 
        int n = heap(T->rchild); 
        return (m > n) ? (m+1) : (n+1);  
    } 
}

int main(){
    cin>>n;
    cin>>pre>>inoder;
    Binode*T;
    T=creatheap(pre,inoder,n);
    h=heap(T);
    cout<

例题: 

题目详情 - 7-2 根据后序和中序遍历输出先序遍历 (pintia.cn)

先序遍历

#include
using namespace std;

const int N=35;
int post[N],inoder[N];
int n;

typedef struct Binode{
    int elem;
    Binode*lchild,*rchild;
}Binode;

Binode*creatheap(int po[],int in[],int N){
    if(N==0)
        return NULL;
    int i=0;
    //Binode*T1=new Binode;
    Binode*T1=(Binode*)malloc(sizeof(Binode));
    T1->elem=po[N-1];
    while(ielem){
            break;
        }
        i++;
    }
    T1->lchild=creatheap(po,in,i);
    T1->rchild=creatheap(po+i,in+i+1,N-i-1);
    return T1;
}

void printheap(Binode*T){
    if(T){
        cout<<' '<elem;
        printheap(T->lchild);
        printheap(T->rchild);
    }
}

int main(){
    cin>>n;
    Binode*T;
    for(int i=0;i>post[i];
    for(int i=0;i>inoder[i];
    cout<<"Preorder:";
    T=creatheap(post,inoder,n);
    printheap(T);
}

例题:

题目详情 - 7-3 树的遍历 (pintia.cn)

树的层序遍历

解析:

通过一个队列对二叉树进行遍历,与广度优先搜索极为相似

#include
using namespace std;

const int N=35;
int post[N],inoder[N];
int n;

typedef struct BiNode{
    int elem;
    BiNode*lchild,*rchild;
}BiNode;

BiNode*creatheap(int p[],int in[],int N){
    if(N<=0)
        return NULL;
    BiNode*T1=new BiNode;
    T1->elem=p[N-1];
    int i=0;
    while(ielem==in[i])
        break;
        i++;
    }
    T1->lchild=creatheap(p,in,i);
    T1->rchild=creatheap(p+i,in+i+1,N-i-1);
    return T1;
}

void printfheap(BiNode*T2){
    queueque;
    que.push(T2);
    int i=0;
    while(!que.empty()){
        auto p=que.front();
        if(i==0)
        cout<elem;
        else
        cout<<' '<elem;
        que.pop();
        if(p->lchild!=NULL)que.push(p->lchild);
        if(p->rchild!=NULL)que.push(p->rchild);
        i++;
    }
}

int main(){
    BiNode*T;
    cin>>n;
    for(int i=0;i>post[i];
    for(int i=0;i>inoder[i];
    T=creatheap(post,inoder,n);
    printfheap(T);
}

你可能感兴趣的:(刷题题解,算法,面试,数据结构)