包含了二叉樹的遞歸建立、前中後序遍歷的遞歸和非遞歸實現以及層序遍歷的非遞歸實現。
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
typedef struct TreeNode{
char data;
TreeNode *lchild,*rchild;
}TreeNode;
//輸入二叉樹的前序遍歷序列來構建二叉樹,#號代表結點爲空
TreeNode* createBinaryTree(TreeNode* root){
char ch;
cin>>ch;
if(ch=='#')
root=NULL;
else{
root=new TreeNode;
root->data=ch;
root->lchild=createBinaryTree(root->lchild);
root->rchild=createBinaryTree(root->rchild);
}
return root;
}
//二叉樹前序遍歷的遞歸實現
void preOrder(TreeNode* root){
if(!root)
return;
else{
cout<<root->data<<" ";
preOrder(root->lchild);
preOrder(root->rchild);
}
}
//二叉樹中序遍歷的遞歸實現
void inOrder(TreeNode* root){
if(!root)
return;
else{
inOrder(root->lchild);
cout<<root->data<<" ";
inOrder(root->rchild);
}
}
//二叉樹後序遍歷的遞歸實現
void postOrder(TreeNode* root){
if(!root)
return;
else{
postOrder(root->lchild);
postOrder(root->rchild);
cout<<root->data<<" ";
}
}
//二叉樹層序遍歷的非遞歸實現(採用隊列)
void levelOrder(TreeNode* root){
if(!root)
return;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
TreeNode *cur=que.front();
que.pop();
cout<<cur->data<<" ";
if(cur->lchild)
que.push(cur->lchild);
if(cur->rchild)
que.push(cur->rchild);
}
}
//二叉樹前序遍歷的非遞歸實現。(採用函數重載的機制,增加一個bool型參數作爲區分)
//中序遍歷和後序遍歷同前序遍歷
void preOrder(TreeNode* root,bool isRecur){
if(!root)
return;
stack<TreeNode*> s;
TreeNode* cur=root;
while(cur||!s.empty()){
//迭代訪問結點的左孩子,併入棧
while(cur){
cout<<cur->data<<" ";
s.push(cur);
cur=cur->lchild;
}
if(!s.empty()){
cur=s.top();
s.pop();
cur=cur->rchild;
}
}
}
void inOrder(TreeNode* root,bool isRecur){
if(!root)
return;
TreeNode* cur=root;
stack<TreeNode*> s;
while(cur||!s.empty()){
while(cur){
s.push(cur);
cur=cur->lchild;
}
//中序遍歷在左結點爲空時輸出根節點
if(!s.empty()){
cur=s.top();
s.pop();
cout<<cur->data<<" ";
cur=cur->rchild;
}
}
}
//後序遍歷:遍歷順序仍舊是先左後右。因爲是後序遍歷,如果當前棧頂元素有右節點,則不pop,cur=top->right,
//然後把棧頂元素的右指針置爲nullptr
void postOrder(TreeNode* root,bool isRecur){
if(!root)
return;
TreeNode *cur=root;
stack<TreeNode*> s;
while(cur||!s.empty()){
if(cur){
s.push(cur);
cur=cur->lchild;
}
else{
TreeNode* top=s.top();
if(!top->rchild){
s.pop();
cout<<top->data<<" ";
continue;
}
cur=top->rchild;
top->rchild=nullptr;
}
}
}
int main()
{ TreeNode *root=NULL;
root=createBinaryTree(root);
cout<<"The binary tree has been created successfully!"<<endl;
cout<<"PreOrder is:";
preOrder(root);
cout<<endl;
cout<<"InOrder is:";
inOrder(root);
cout<<endl;
cout<<"PostOrder is:";
postOrder(root);
cout<<endl;
cout<<"LevelOrder is:";
levelOrder(root);
cout<<endl;
cout<<"No-Recur PreOrder is:";
preOrder(root,0);
cout<<endl;
cout<<"No-Recur InOrder is:";
inOrder(root,0);
cout<<endl;
cout<<"No-Recur PostOrder is:";
postOrder(root,0);
cout<<endl;
return 0;
}