/*
*
/ \
+ *
/ \ / \
a b c -
\
d
(a+b)*(c*(-d))
*/
typedef struct node{
char data[10];
struct node *left,*right;
}BTree;
/*树的习题还是离不开4种遍历,以及我发现递归用的比非递归多好多,拿到树先大概试一试4种遍历的次序哪个更接近想要的结果,发现中序遍历结果更合适,于是定下基本论调是中序遍历*/
void BtreeToE(BTree *root){
BtreeToExp(root,1);
}
/*除了根结点和叶子结点以外,遍历其他结点左子树时,先输出左括号。遍历完右子树后,输出右括号即可*/
void BtreeToExp(Btree *T,int deep){
if(T==NULL)
return;
else if(T->left==NULL&&T->right==NULL)//叶子结点输出其值
printf("%s",T->data);
else{
if(deep>1) //非树根节点,非叶子结点,遍历左子树前,输出左括号
printf("(");
BtreeToExp(T->left,deep+1);
printf("%s",T->data); //子树的根节点,输出操作符
BtreeToExp(T->right,deep+1);
if(deep>1) //非树根节点,遍历完右子树,输出右括号
printf(")");
}
}
二叉树的习题,真的是到处充斥着遍历的变型,而且用到最多的基本都是递归遍历的改编,而递归又恰巧是我最大的弱项…总的来说…还是多练习吧。
这道题我能想到需要中序遍历,于是手撸上去了中序的非递归遍历,然后对加括号的问题傻住了,但其实非递归遍历应该还是有办法做的吧。总之王道给出的答案,大部分都是对应的递归遍历,而且貌似写出递归遍历就能给满分?所以还是需要多加思考多加练习,熟能生巧吧。