二叉树类:
#ifndef TNODE_H
#define TNODE_H
template<typename T>
class tnode<T> {
public:
tnode<T>* left, right; //一个节点由三部分构成,指向左子树的指针,指向右子树的指针和它自己的值
int tnodeValue;
tnode():left (NULL),right(NULL) {}
tnode(const T& item, tnode<T>* leftCh = NULL, tnode<T>* rightCh = NULL) :tnodeValue(item), left(leftCh),right(rightCh){}
//上面这样写依旧可以用anode->left anode->right指定参数
};
#endif
由后缀表达式建立表达式树:
tnode<char> *buildExpTree(const string &pexp)
{
//若是操作数则压入栈 若是运算符则弹出栈内元素 先出来的是右子树 后出来的是左子树 建成树之后再放回去
//char pepxArray[pexp.lenth()] = pexp;//string类型不需要这句,直接pexp[i]即可
for (int i = 0; i < pexp.length() - 1; i++)
{
tnode<char>* anode = new tnode(a[i]);
if (a[i] >= 97 && a[i] <= 122 || a[i] >= 65 && a[i] <= 90)
aStack.push(anode);
else if (pexp[i] == 37 || (pexp[i] >= 40 && pexp[i] <= 43) || pexp[i] == 45 || pexp[i] == 47)
{
anode->right = aStack.top();//top返回值也是<tnode<char>*类型
aStack.pop();
anode->left = aStack.top();
aStack.pop();
aStack.push(anode);
}
else
cout << "输入的后缀表达式有误!" << endl;
}
}
前、中、后序遍历:
不知道该怎么解释递归算法…自己想了很久都没法方便地实现遍历,这样的算法感觉超棒der
void readFront(tnode<char> *t)//前序遍历
{
if (t != NULL)
{
cout << t->tnodeValue;
readFront(t->left);
readFront(t->right);
}
}
void readAfter(tnode<char> *t)//后序遍历
{
if (t != NULL)
{
readAfter(t->left);
readAfter(t->right);
cout << t->tnodeValue;
}
}
void readMiddle(tnode<char> *t)//中序遍历
{
if (t != NULL)
{
readMiddle(t->left);
cout << t->tnodeValue;
readMiddle(t->right);
}
}