二叉树的深度与广度遍历及前序遍历递归非递归实现
2016-09-22 21:23
531 查看
一、深度优先遍历
深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。
如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
![](http://www.blogjava.net/images/blogjava_net/fancydeepin/binarytree1.png)
如右图所示的二叉树:
A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。
那么,怎么样才能来保证这个访问的顺序呢?
分析一下,在遍历了根结点后,就开始遍历左子树,最后才是右子树。
因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,
这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。
自己写的代码显然不够简便
如图输出A B C D E F G
仿照上述很容易写出代码
广度优先遍历
三、前序遍历
递归实现
前序遍历:ABDECFG
非递归实现
非递归
递归
五、后序遍历
非递归
void postorder(BinaryTreenode* root)
{
if(root==NULL)return;
stack<BinaryTreeNode*> s;
BinaryTreeNode* pre=NULL;
BinaryTreeNode* cur=NULL;
s.push(root);
while(!s.empty())
{
cur=s.top();
if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right)))
{
cout<<cur->value;
s.top();
pre=cur;
}
else
{
if(cur->right)
s.push(cur->right);
if(cur->left)
s.push(cur->left);
}
}
}
深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。
如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
![](http://www.blogjava.net/images/blogjava_net/fancydeepin/binarytree1.png)
如右图所示的二叉树:
A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。
那么,怎么样才能来保证这个访问的顺序呢?
分析一下,在遍历了根结点后,就开始遍历左子树,最后才是右子树。
因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,
这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。
自己写的代码显然不够简便
void Depthinorder(BinaryTreeNode* root) { if (root == NULL)return; BinaryTreeNode* node = root; stack<BinaryTreeNode*> s; while (node!=NULL||!s.empty()) { while (node != NULL) { cout << node->value << endl; s.push(node); node = node->left; } if (!s.empty()) { node = s.top(); while (node->right == NULL) { s.pop(); if (s.empty())break; node = s.top(); } if (s.empty())break; node = node->right; s.pop(); } } }大神写的
void depthFirstSearch(BinaryTreeNode* root){ stack<BinaryTreeNode*> nodeStack; nodeStack.push(root); BinaryTreeNode *node; while (!nodeStack.empty()){ node = nodeStack.top(); cout<<node->value; //遍历根结点 nodeStack.pop(); if (node->right){ nodeStack.push(node->right); //先将右子树压栈 } if (node->left){ nodeStack.push(node->left); //再将左子树压栈 } } }二、广度优先遍历
如图输出A B C D E F G
仿照上述很容易写出代码
广度优先遍历
void G(BinaryTreeNode* root) { if (root == NULL)return; queue<BinaryTreeNode*> q; q.push(root); BinaryTreeNode* node; while (!q.empty()) { node = q.front(); cout << node->value; q.pop(); if (node->left) q.push(node->left); if (node->right) q.push(node->right); } }
三、前序遍历
递归实现
前序遍历:ABDECFG
void Preorder(BinaryTreeNode* root) { if (root == NULL)return; cout << root->value; if (root->left) Preorder(root->left); if (root->right) Preorder(root->right); }
非递归实现
void Preprint1(BinaryTreeNode* root) { if (NULL == root)return; stack<BinaryTreeNode*> s; BinaryTreeNode* node =root; s.push(node); while (!s.empty()) { node = s.top(); cout << node->value; s.pop(); if (node->right)s.push(node->right); if (node->left)s.push(node->left); } }四、中序遍历
非递归
void inorder1(BinaryTreeNode* root) { if (root == NULL)return; stack<BinaryTreeNode*> s; BinaryTreeNode* node = root; while (node!=NULL||!s.empty()) { while (node != NULL) { s.push(node); node = node->left; } if (!s.empty()) { node = s.top(); cout << node->value; s.pop(); node = node->right; } } }
递归
void inorder(BinaryTreeNode* root) { if (root == NULL)return; BinaryTreeNode* node = root; if (root->left)inorder(root->left); cout <<root->value << endl; if (root->right)inorder(root->right); }
五、后序遍历
非递归
void postorder(BinaryTreenode* root)
{
if(root==NULL)return;
stack<BinaryTreeNode*> s;
BinaryTreeNode* pre=NULL;
BinaryTreeNode* cur=NULL;
s.push(root);
while(!s.empty())
{
cur=s.top();
if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right)))
{
cout<<cur->value;
s.top();
pre=cur;
}
else
{
if(cur->right)
s.push(cur->right);
if(cur->left)
s.push(cur->left);
}
}
}
相关文章推荐
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式 二叉树的遍历方式: 1、深度优先:递归,非递归实现方式 1)先序遍历:先访问根节点,再依次访问左子树和右子树 2)中序遍
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 八.二叉树各种操作的C语言实现 深度遍历求深度,广度遍历求深度,交换左右子树,求叶子节点数
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- java 实现二叉树深度优先遍历的 前、中、后序遍历(递归)
- 递归实现图的深度和广度遍历
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的深度优先递归、非递归遍历、广度优先遍历 实例
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 递归实现树的遍历,深度未知,广度未知
- [二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- C++ 实现求二叉树的深度及遍历(递归与非递归算法)
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现