【问题描述】假设二叉树中每个结点值均为单个字符,采用链式的存储结构。分别输出该二叉树先序遍历中序遍历和后序遍历的结果。
【输入形式】
第一行:以括号表示法输入该二叉树的所有结点
【输出形式】
第一行:输出先序遍历的结果
第二行:输出中序遍历的结果
第三行:输出后序遍历的结果
【样例输入】
a(c,b)
【样例输出】
acb
cab
cba
【样例说明】
符号均为半角符号,中间无空格,输入字符串的长度不超过N(N<=100)
这次的变成题目是根据括号表达式匹配转化成二叉树链存储的形式
这道题目的整体思路:
Step1:将括号表达式转化成二叉链的存储结构
Step2:再依次先中后遍历输出节点
注意这里遇到左右括号,逗号时不同的处理方式。
遇到左括号时说明刚刚读取的节点有孩子,应该将其入栈,并指示flag,下一个节点为左孩子;逗号修改flag值;右括号将top节点出栈,表示已经处理完这个节点。其他遇到节点情况,先判断是否跟节点为空(这里root的初始化不能简单BTNode *root;此时并不为空,应该是BTNode *root=NULL;)不注意的话可能会陷入奇奇怪怪的循环之中。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct BTNode
{
char val;
BTNode *lchild;
BTNode *rchild;
BTNode()
{
lchild = rchild = NULL;
}
BTNode(char cc)
{
lchild = rchild = NULL;
val = cc;
}
};
void xian(BTNode *p)
{
if (p != NULL)
{
cout << p->val;
xian(p->lchild);
xian(p->rchild);
}
}
void hou(BTNode *p)
{
if (p != NULL)
{
hou(p->lchild);
hou(p->rchild);
cout << p->val;
}
}
void zhong(BTNode *p)
{
if (p != NULL)
{
zhong(p->lchild);
cout << p->val;
zhong(p->rchild);
}
}
int main()
{
string str;
stack<BTNode *> st;
BTNode *root = NULL;
BTNode *p;
// 注意上面两行对于节点初始化的不同
bool flag;
cin >> str;
int i = 0;
while (i < str.length())
{
switch (str[i])
{
case '(':
st.push(p);
flag = false;
break;
case ',':
flag = true;
break;
case ')':
st.pop();
break;
default:
p = new BTNode(str[i]);
if (root == NULL)
{
root = p;
}
else
{
if (!st.empty() && !flag)
{
st.top()->lchild = p;
}
if (!st.empty() && flag)
{
st.top()->rchild = p;
}
}
}
i++;
}
xian(root);
cout << endl;
zhong(root);
cout << endl;
hou(root);
cout << endl;
return 0;
}