上一篇写完树的非递归先序遍历,接下来写中序遍历
先定义树结点类,并创建好对象,相比先序,中序在结点多了状态值以供判断是否已入过栈:
//树结点
class TreeNode {
private:
char name_;
public:
int State;//状态值
TreeNode* leftNode;
TreeNode* rightNode;
public:
TreeNode(char a):name_(a) {
State = 0;
leftNode = NULL;
rightNode = NULL;
}
char getName() {
return name_;
}
};
Void main(){
//初始化树
TreeNode node1('A');
TreeNode node2('B');
TreeNode node3('C');
TreeNode node4('D');
TreeNode node5('E');
TreeNode node6('F');
TreeNode node7('G');
TreeNode node8('H');
TreeNode node9('I');
node1.leftNode = &node2;
node1.rightNode = &node3;
node2.leftNode = &node4;
node2.rightNode = &node5;
node3.rightNode = &node6;
node4.leftNode = &node7;
node4.rightNode = &node8;
node6.leftNode = &node9;
}
此时的树形结构如下:
先编写中序遍历函数:
//非递归中序遍历
void MiddlePush(TreeNode& TreeTop) {
stack<TreeNode> STN;
STN.push(TreeTop);
while (STN.size()) {
TreeNode Top = STN.top();
if (!Top.State) {
STN.pop();
Top.State = 1;
STN.push(Top);
if (Top.rightNode) {
STN.pop();
STN.push(*Top.rightNode);
STN.push(Top);
}
if (Top.leftNode) {
STN.push(*Top.leftNode);
}
}
else {
cout << Top.getName() << ends;
STN.pop();
}
}
cout << endl;
}
测试遍历结果: