【先序】
递归实现:
void PreOrderTraversal(BinTree BT){
if(BT){
cout << BT->Data;
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
非递归
①建立一个栈,并把根节点放入栈中
②进入循环,循环条件是栈不为空
1°新建一个节点结构,弹出栈顶拷贝给新节点,并打印
2°把节点的右儿子放入栈中
3°把节点的左儿子放入栈中
4°继续循环
③跳出循环,遍历结束
void PreOrderTraversal(BinTree BT){
BinTree tmp = BT;
stack s;
s.push(tmp);
while(!s.empty()){
tmp = s.top(); s.pop();
if(tmp->right != null)
s.push(tmp->right);
if(tmp->left != null)
s.push(tmp->left);
}
}
【中序】
递归:
void InOrderTraversal(BinTree BT){
if(BT){
PreOrderTraversal(BT->Left);
cout << BT->Data;
PreOrderTraversal(BT->Right);
}
}
非递归:
①建栈
②进入循环,条件是栈不为空或者当前节点不为空
1°如果当前节点不为空,则把当前节点压入栈,并更新当前节点为其左儿子
2°否则从栈中弹出一个并打印,更新当前节点为弹出节点的右儿子
3°循环1°2°
③退出循环结束
void InOrderTraversal(BinTree head){
if(head != null){
stack s;
while(!s.empty() || head != null){
if(head != null){
s.push(head);
head = head->left;
}
else{
head = s.top(); s.pop();
cout << head->Data;
head = head->right;//有可能没有右儿子,那head = null;
}
}
}
}
【后序】
递归:
void PostOrderTraversal(BinTree BT){
if(BT){
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
cout << BT->Data;
}
}
非递归:
后序—》左右中
先序—》中左右—》(很容易得到)中右左,而中右左就是后序的逆,把中右左放到栈中,在打印就是左右中,即后序遍历;
①建立俩个栈,一个正常栈s,一个辅助栈help
②把根节点压入栈
③进入循环,循环条件是栈s不为空
1°从s中弹出放到help栈中,
2°把当前节点的左儿子放入栈s
3°右儿子放入栈s
④循环结束后,弹出help栈中所有元素
void PreOrderTraversal(BinTree BT){
BinTree tmp = BT;
stack s, help;
s.push(tmp);
while(!s.empty()){
help.push(s.top()); s.pop();
if(tmp->left != null)
s.push(tmp->left);
if(tmp->right != null)
s.push(tmp->right);
}
while(!help.empty()){
cout << help.top().data;
help.pop();
}
}