以下的C++代码实现六种遍历方式,递归和非递归各三种
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
vector<int> preorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> ans;
TreeNode* temp=root;
while(!st.empty()||temp!=NULL)
{
while(temp!=NULL)//在访问过当前节点之后将左臂入栈
{
ans.push_back(temp->val);
st.push(temp);
temp=temp->left;
}
if(!st.empty())//出栈一个元素,开始处理右孩子
{
temp=st.top();
st.pop();
temp=temp->right;
}
}
return ans;
}
vector<int> inorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> ans;
TreeNode* temp=root;
while(!st.empty()||temp!=NULL)
{
while(temp!=NULL)//将左臂入栈
{
st.push(temp);
temp=temp->left;
}
if(!st.empty())//出栈的同时立即访问,之后,转向处理右孩子
{
temp=st.top();
st.pop();
ans.push_back(temp->val);
temp=temp->right;
}
}
return ans;
}
vector<int> postorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> ans;
TreeNode* p=root,*q;
bool flag;
do
{
while(p)//左臂入栈
{
st.push(p);
p=p->left;
}
q=NULL;//为空或者指向刚刚访问的节点
flag=true;
while(!st.empty()&&flag)
{
p=st.top();//取栈顶元素进行判断
if(p->right==q)//p节点的右子树已经访问过了(左子树更不用说)
{
ans.push_back(p->val);//左右子树都已经处理过了就可以开始处理当前节点了
st.pop();
q=p;
}
else
{
p=p->right;//没有访问过就转向处理右子树
flag=false;//退出这层循环
}
}
}while(!st.empty());
return ans;
}
/*使用do-while循环的理由:一个节点只有在访问过后才退栈,最后结束的判断是栈为空,属于先操作后判断,所以使用do-while循环更加恰当*/
void preOrder(TreeNode* root,vector<int>& ans)
{
ans.push_back(root->val);
if(root->left) preOrder(root->left,ans);
if(root->right) preOrder(root->right,ans);
}
vector<int> preorderTraversal2(TreeNode* root)
{
vector<int> ans;
if(root==NULL) return ans;
preOrder(root,ans);
return ans;
}
void inOrder(TreeNode* root,vector<int>& ans)
{
if(root->left) inOrder(root->left,ans);
ans.push_back(root->val);
if(root->right) inOrder(root->right,ans);
}
vector<int> inorderTraversal2(TreeNode* root)
{
vector<int> ans;
if(root==NULL) return ans;
inOrder(root,ans);
return ans;
}
void postOrder(TreeNode* root,vector<int>& ans)
{
if(root->left) postOrder(root->left,ans);
if(root->right) postOrder(root->right,ans);
ans.push_back(root->val);
}
vector<int> postorderTraversal2(TreeNode* root)
{
vector<int> ans;
if(root==NULL) return ans;
postOrder(root,ans);
return ans;
}
int main()
{
TreeNode* m1=new TreeNode(1);
TreeNode* m2=new TreeNode(2);
m1->right=m2;
vector<int> ans1=preorderTraversal(m1);
for(int i=0;i<ans1.size();i++)
{
cout<<ans1[i]<<" ";
}
cout<<endl;
vector<int> ans2=inorderTraversal(m1);
for(int i=0;i<ans2.size();i++)
{
cout<<ans2[i]<<" ";
}
cout<<endl;
vector<int> ans3=postorderTraversal(m1);
for(int i=0;i<ans3.size();i++)
{
cout<<ans3[i]<<" ";
}
cout<<endl;
vector<int> ans4=preorderTraversal2(m1);
for(int i=0;i<ans4.size();i++)
{
cout<<ans4[i]<<" ";
}
cout<<endl;
vector<int> ans5=inorderTraversal2(m1);
for(int i=0;i<ans5.size();i++)
{
cout<<ans5[i]<<" ";
}
cout<<endl;
vector<int> ans6=postorderTraversal2(m1);
for(int i=0;i<ans6.size();i++)
{
cout<<ans6[i]<<" ";
}
cout<<endl;
cout<<"ok"<<endl;
}