通过前序(后序), 中序遍历建立二叉树 求解层次遍历

题目链接


不管是二叉树的建立 求前遍历 后遍历 还是层次遍历,都是利用中序遍历的性质 和一个前序遍历或后序遍历,将一个节点的左支所有的数,右支所有的数,和该节点的数分开,然后根据题目重新排序;


前序遍历:该节点的数、左支的数、右支的数;

中序遍历:左支的数、该节点的数、右支的数;

后序遍历:自己想想...左支的数、右支的数、该节点的数


(前序遍历就是节点的数总是在它的左支和右支的数遍历前遍历(先左支后右支);  后序遍历就是节点的数在它的左支的数和右支的数都遍历完后遍历(先左支后右支);中序就是遍历左支、遍历节点、遍历右支 这个顺序  真的不知道??。。)


其他的在揣摩揣摩  附上代码  以上问题都能解决

#include<iostream>
#include<string>
#include<cstdio>
#include<malloc.h>

using namespace std;

struct tree
{
    char key;
    tree *left;
    tree *right;
};

tree *creat(string pre,string mid)//二叉树的建立  
{

    if(pre.size()<=0)
    {
        return NULL;
    }
    tree *p;
    p=new tree[1];
    p->key=pre[0];
    int pos=mid.find(pre[0]);
    p->left=creat(pre.substr(1,pos),mid.substr(0,pos));
    int len=mid.size()-pos-1;
    p->right=creat(pre.substr(pos+1,len),mid.substr(pos+1,len));
    return p;
}

int print_mid(tree *ROOT)//中序遍历
{
    if(ROOT==NULL)
    {
        return 0;
    }
    print_post(ROOT->left);
    cout << ROOT->key;
    print_post(ROOT->right);
    return 0;
}

int print_post(tree *ROOT)//后序遍历
{

    if(ROOT==NULL)
    {
        return 0;
    }
    print_post(ROOT->left);
    print_post(ROOT->right);
    cout << ROOT->key;
    return 0;


}

int print_forth(tree *ROOT)//前序遍历
{
    if(ROOT==NULL)
    {
        return 0;
    }
    cout << ROOT->key;
    print_post(ROOT->left);
    print_post(ROOT->right);
    return 0;
}

int PrintByLevel(tree *ROOT)//层次遍历(分级遍历)
{
    tree *temp[100];//存储每个节点的地址
    int j;
    for(j=0;j<100;j++)
    {
        temp[j]=NULL;
    }
    temp[0]=ROOT;//初始只有一个节点  即根节点
    j=0;
    int t=1;
    while(temp[j]!=NULL)
    {
        if(temp[j]->left!=NULL)//不好解释  好好看看  不算复杂;
        {
            temp[t++]=temp[j]->left;
        }
        if(temp[j]->right!=NULL)
        {
            temp[t++]=temp[j]->right;
        }
        cout<<temp[j]->key;
        j++;
    }
}


int main()
{
    string pre_order;
    string post_order;
    int n;cin>>n;
    while(n--)
    {
        tree *root;
        cin>>pre_order>>post_order;
        root=creat(pre_order,post_order);
        print_post(root);
        cout<<endl;
        PrintByLevel(root);
        cout<<endl;
//        print_forth(root);
//        cout<<endl;
//        print_mid(root);
//        cout<<endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值