非递归先序遍历二叉树似乎大概率中面试考题,所以在了解了递归遍历的机制后,着手写下非递归的先序遍历。
先定义树结点类,并创建好对象,这里图方便使用了栈容器而没有自定义链表:
//树结点
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 FirstPush(TreeNode& TreeTop) {
stack<TreeNode> STN;
STN.push(TreeTop);
while (STN.size()) {
TreeNode Top = STN.top();
cout << Top.getName() << ends;
STN.pop();
if (Top.rightNode) {
STN.push(*Top.rightNode);
}
if (Top.leftNode) {
STN.push(*Top.leftNode);
}
}
cout << endl;
}
测试一次遍历结果: