这篇主要是记录一下学习二叉树的深度搜索和广度搜索的学习过程,有问题希望大家多多指正。
首先,下图是一颗二叉树:
深度优先搜索(DFS):
深度优先搜索是从根节点出发,沿左子树方向进行纵向遍历,直到找到叶子结点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。
遍历顺序:A B D E C F G
其实就是先遍历根节点,再遍历左子树,最后遍历右子树,跟先序遍历的过程是一样的。
那我们要如何实现DFS算法呢?
这里我们需要借助一个我们很熟悉的数据结构,那就是栈
为何要用栈呢?我们都知道栈是一种先进后出的数据结构,假如我们可以把二叉树按照根节点,右孩子,左孩子的顺序压入栈中,然后依次出栈,这时候在用到遍历让左右孩子也都按照这个顺序去进出栈,我们不就实现了DFS算法了么,所以,请看代码:
//stack所在的库
#include <stack>
void DFSTree(Node * root)
{
//声明一个栈,C++ STL库
stack <Node*> nodeStack;
nodeStack.push(root);
//临时指针变量
Node* node;
while(!nodeStack.empty())
{
//获取栈顶元素指针
node = nodeStack.top();
printf_s("%c",node->data);
nodeStack.pop();
if(node->rchild){nodeStack.push(node->rchild);}
if(node->lchild){nodeStack.push(node->lchild);}
}
}
广度优先搜索(BFS):
广度优先搜索是从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。
同样是第一个图,这时候其顺序就是:
A B C D E F G
那又如何实现BFS呢?同样我们要利用到一种数据结构队列,其先进先出,所以我们可以用其很好的实现顺序遍历,根节点进队,然后通过循环让左子树,右子树进队出队即可。
实现如下:
void BFSTree(Node* root)
{
queue <Node*> nodeQueue;
nodeQueue.push(root);
node* node;
while(!nodeQueue.empty())
{
node=nodeQueue.front();
printf_s("%c",node->data);
nodeQueue.pop();
if(node->lchild){nodeQueue.push(node->lchild);}
if(node->rchild){nodeQueue.push(node->rchild);}
}
}
That’s All…