【机试书】二叉树遍历

 

大致思路:

最开始一直想着在字符串上“换顺序”,导致思路很不清晰。

其实,就活学活用已经掌握的方法——根据前序和中序遍历结果来构造二叉树!

构造二叉树之后,再对其进行后序遍历(递归的方法)。

要注意的点:

① 题目说输入“字符串”,但是其实一般来说,为了编程的方便,可以定义char数组来储存字符串并进行操作,用法如下:

char a[30]; //可以自设字符串大小
scanf("%s",a); //很灵活每次输入都相当于“刷新”。注意不加“&”,因为字符数组名a就是首地址,不需要再取地址!
int L = strlen(a); //求字符数组存储的字符串长度,用strlen

② 注意二叉树的结构体定义中,构造函数的写法。并且注意val值的类型是char不是int了。

 

AC代码:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;

struct BTNode
{
    char val;
    BTNode *left;
    BTNode *right;
    BTNode(char x): val(x),left(NULL),right(NULL){}
};

//将前序和中序遍历结果进行对照,划分出左子树+右子树,递归 
BTNode * constru(char* pre,int preStart,int preEnd,char* in, int inStart,int inEnd)
{
    if(preStart>preEnd || inStart>inEnd)
        return NULL; //对照不了,因为此树为空 
    BTNode *head=new BTNode(pre[preStart]); //根节点
    for(int i=inStart;i<=inEnd;i++)
    {
        if(in[i]==pre[preStart])
        {
            head->left = constru(pre,preStart+1,preStart+i-inStart,in,inStart,i-1);
            head->right = constru(pre,preStart+i-inStart+1,preEnd,in,i+1,inEnd);
            break;
        }
    }
    return head;
}

void postOrder(BTNode* head)
{
    if(head->left!=NULL)
        postOrder(head->left);
    if(head->right!=NULL)
        postOrder(head->right);
    cout<<head->val;
}



int main()
{
    char pre[30],in[30];
    while(scanf("%s",pre)!=EOF)
    {
        scanf("%s",in);
        int L1 = strlen(pre);
        int L2 = strlen(in);
        BTNode *head = constru(pre,0,L1-1,in,0,L2-1);
        //构造好这棵二叉树,对其后序遍历
        postOrder(head);
        cout<<endl;
    }
    return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值