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)遇到左括号,说明出现了新的子树,将父节点推入栈中;
(2)遇到右括号,说明当前子树输入内容结束;
(3)不是逗号,则只剩下了字母或者说树节点元素值,这时只需判断该元素是父节点的左右子树,当 str[i-1] == ',' 时,为右子树。

本文介绍了如何定义一个二叉树类,并提供了非递归实现的遍历操作。通过嵌套括号表示法构建二叉树,`buildTree`函数处理输入字符串,遇到括号和逗号进行相应操作。二叉树的前中后序非递归遍历在书中已有详细解释。代码实现可在提供的链接查看。
696

被折叠的 条评论
为什么被折叠?



