给定形如以下图片的二叉树:
原理:栈是先进后出,首先父节点入栈,然后父节点出栈,右儿子和左儿子分别入栈,然后循环上过程,递归的过程则看下方图片
递归输出位置的不同则造成了不同遍历,广搜则是父节点入队,然后左儿子右儿子入队,然后父节点出队,每次都是将当前节点能到达的节点位置入队,这个过程可以通过画图来理解。当前这个二叉树没必要用标记数组来标记,但是如果是其他图,则有时候入队需要标记来防止重复入队。
相关代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <stack>
using namespace std;
queue<int> myq;
stack<int> mys;
int tree[7]{1,2,3,4,5,6,7};
void StackDfs(int num)//运用栈来实现深搜(前序遍历)
{
while(!mys.empty())
{
int node=mys.top();
mys.pop();
printf("%d",tree[node]);
if(node*2+2<num)
{
mys.push(node*2+2);
}
if(node*2+1<num)
{
mys.push(node*2+1);
}
}
}
void Dfs(int node,int num)//运用递归来实现深搜(前序遍历)
{
printf("%d",tree[node]);
if(node*2+1<num)
{
Dfs(node*2+1,num);
}
if(node*2+2<num)
{
Dfs(node*2+2,num);
}
}
void Bfs(int num)//运用队列来实现广搜
{
while(!myq.empty())
{
int node=myq.front();
printf("%d",tree[node]);
if(node*2+1<num)
{
myq.push(node*2+1);
}
if(node*2+2<num)
{
myq.push(node*2+2);
}
myq.pop();
}
}
int main(int argc, char *argv[]) {
mys.push(0);
myq.push(0);
StackDfs(7);
printf("\n");
Dfs(0,7);
printf("\n");
Bfs(7);
return 0;
}
运行效果: