1. 题目描述:
定义二叉树类,封装构造二叉树操作,遍历操作(非递归实现)。
2. 题目分析:
参考教材,定义二叉树类是很容易的(书上定义已经给了,还差简单的实现);
封装构造二叉树操作,稍微需要考虑一下私有类型,而且 BinTree 已经定义为 BinTreeNode 的友元类了,难度会降低很多。
第一个问题是如何构建一个二叉树,考虑到数据输入和构造二叉树的一些方法,我觉得是要花一些时间的。本文构建二叉树采用嵌套括号表示法输入。这里简单介绍一下嵌套括号表示法:"(A(B(,D(F,G)),C(,E(,H))))",我还是建议直接看书(P84 图3-2-d)。
template<class T>
void BinTree<T>::buildTree(string str) {
stack<BinTreeNode<T> *> nodeStack;
BinTreeNode<T> * cur;
root = new BinTreeNode<T>(str[1]);
cur = root;
for(int i = 2; i < str.size() - 1; i++) {
// 注意一下这个地方,如果上面写成 for(int i = 2, cur = root; i < str.size() - 1; i++)
// 会报错,原因是 在括号里 cur 为局部变量,是 int 类型
if(str[i] == '(') {
nodeStack.push(cur);
} else if(str[i] == ')') {
// cur = nodeStack.top();
nodeStack.pop();
} else if(str[i] != ',') { // 只有字母被剩下了
if(str[i-1] != ',') { // 左子树
cur->lc = new BinTreeNode<T>(str[i]);
cur = cur->lc;
// nodeStack.push(cur);
} else {
cur = nodeStack.top();
cur->rc = new BinTreeNode<T>(str[i]);
cur = cur->rc;
// nodeStack.push(cur);
}
}
}
}
buildTree 为二叉树构建函数,传入参数为一字符串,开头和结尾的左右括号是无用的,因此循环跳过。函数内首先声明二叉树节点类型的栈结构,循环内部只要想法是:
(1)遇到左括号,说明出现了新的子树,将父节点推入栈中;