前序遍历
先结点再左右子树
使用栈的方式
- 输出结点(中) 压入栈中
- 左子树
- 右子树
遇到非空结点不停的压栈 若遇到空结点 指针指向栈顶元素的右结点 则栈顶元素弹出 继续
利用了栈先进后出的特点 每一次遇到空结点 我们首先要向上找它的父结点就是栈顶
//前序遍历非递归
void PreOderN(btlink T)
{
stack<btlink>st;
while(T!=NULL||!st.empty())//循环结束条件 结点不为空 栈不为空
{
if(T!=NULL)
{
cout<<" "<<T->data;//中
st.push(T);//将结点压入栈中
T=T->left; //左
}
else
{
T=st.top();
st.pop();
T=T->right;//右
}
}
}
//中序遍历非递归
void InOderN(btlink T)
{
stack<btlink>st;
while(T!=NULL||!st.empty())
{
if(T!=NULL)
{
st.push(T);
T=T->left;//左
}
else
{
T=st.top();
cout<<" "<<T->data;//中
st.pop();
T=T->right;//右
}
}
}
后序遍历
采用栈的方式
左右中-》中右左
和上面两种非递归类似
//后序遍历
void PostOder(btlink T)
{
stack<btlink>st1;
stack<btlink>st2;
while(T!=NULL||!st1.empty())
{
if(T!=NULL)
{
st1.push(T);
st2.push(T);//中 //只有这里不同
T=T->right;//右
}
else
{
T=st1.top();
st1.pop();
T=T->left;//左
}
}
while(!st2.empty())
{
cout<<st2.top()->data<<" ";
st2.pop();
}
}
层序遍历
队列方式
//层序遍历
void LevelOder(btlink T)
{
queue<btlink>qu;
if(T==NULL)
{
return;
}
qu.push(T);;
while(!qu.empty())
{
cout<<qu.front()->data;
if(qu.front()->left!=NULL)
{
qu.push(qu.front()->left);
}
if(qu.front()->right!=NULL)
{
qu.push(qu.front()->right);
}
qu.pop();
}
}