pat甲级1130. Infix Expression (25)

xiaoxiao2021-02-28  50

欢迎访问我的pat甲级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981078

题目描述

 

题意分析

给定一棵表达式树,输出它的中缀表达式。

算法设计

相当于输出一棵二叉树的中根遍历序列,唯一需要处理的就是括号。通过样例可以看出,如果左子树或者右子树(如果存在的话)不是叶子结点,就需要()将左子树或者右子树包含进去,将这一点加入到递归过程中即可。

C++代码

#include<bits/stdc++.h> using namespace std; struct Node{//结点类 string data; int left=-1,right=-1; }; Node tree[25]; int N; bool isLeaf(int v){//判断是否是叶子结点 return tree[v].left==-1&&tree[v].right==-1; } void DFS(int v){//深度优先遍历 if(tree[v].left!=-1){//左子树非空 printf("%s",!isLeaf(tree[v].left)?"(":"");//如果左子树不是叶子结点输出( DFS(tree[v].left); printf("%s",!isLeaf(tree[v].left)?")":"");//如果左子树不是叶子结点输出) } cout<<tree[v].data; if(tree[v].right!=-1){//右子树非空 printf("%s",!isLeaf(tree[v].right)?"(":"");//如果右子树不是叶子结点输出( DFS(tree[v].right); printf("%s",!isLeaf(tree[v].right)?")":"");//如果右子树不是叶子结点输出) } } int main(){ scanf("%d",&N); bool child[N+1]={false}; for(int i=1;i<=N;++i){ cin>>tree[i].data>>tree[i].left>>tree[i].right; if(tree[i].left!=-1) child[tree[i].left]=true; if(tree[i].right!=-1) child[tree[i].right]=true; } DFS(find(child+1,child+N+1,false)-child);//child中为false的结点就是根节点 return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-2627579.html

最新回复(0)