非递归实现遍历二叉树
2016-04-23 19:21
232 查看
非递归实现二叉树主要利用queue和stack的特点,对于层次遍历二叉树主要运用queue队头出,队尾插入,先进先出的特点,先将根插入队尾,然后输出队头的元素,同时将队头的左子树和右子树元素插入队尾,依次输出输出队头的元素,同时将队头的左子树和右子树元素插入队尾,直到队列为空。
void levelorder()
{
queue<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
s.push(_root);
while (!s.empty())
{
BinaryTreeNode<T> *front=s.front();
cout << front->_data << " ";
if (front->_left)
s.push(front->_left);
if (front->_right)
s.push(front->_right);
s.pop();
}
}
非递归实现二叉树前序遍历主要运用stack的先进后出的特点,先把根压入栈里,同时先把左子树的左子树元素以此压入栈底,最后左子树的最后一个元素压入栈底之后,再将栈底元素弹出栈,再判断栈底最后一个元素的右子树,利用以上的方法。代码如下:
void prevorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
s.push(_root);
while (!s.empty())
{
BinaryTreeNode<T> *cur = s.top();
cout << cur->_data << " ";
s.pop();
if (cur->_right)
s.push(cur->_right);
if (cur->_left)
s.push(cur->_left);
}
}
非递归实现二叉树中序遍历主要运用stack的先进后出的特点,先把根压入栈里,同时先把左子树的左子树元素以此压入栈底,最后左子树的最后一个元素压入栈底之后,判断栈底最后一个元素的右子树,利用以上的方法。代码如下:
void inorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
BinaryTreeNode<T> *cur = _root;
while (cur||!s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
cout << s.top()->_data << " ";
cur = s.top()->_right;
s.pop();
}
}
非递归实现二叉树后序遍历主要运用stack的先进后出的特点,在利用前序和后序的共同特点
void postorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
BinaryTreeNode<T> *cur = _root;
BinaryTreeNode<T> *prev = NULL;
s.push(cur);
while (cur || !s.empty())
{
while (cur->_left&&cur->_left!=prev)
{
s.push(cur->_left);
cur = cur->_left;
}
if (s.top()->_right&&s.top()->_right != prev)
{
cur = s.top()->_right;
s.push(cur);
}
else
{
cout << s.top()->_data << " ";
prev = s.top();
s.pop();
cur = s.top();
cur->_left =NULL;
}
}
}
void levelorder()
{
queue<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
s.push(_root);
while (!s.empty())
{
BinaryTreeNode<T> *front=s.front();
cout << front->_data << " ";
if (front->_left)
s.push(front->_left);
if (front->_right)
s.push(front->_right);
s.pop();
}
}
非递归实现二叉树前序遍历主要运用stack的先进后出的特点,先把根压入栈里,同时先把左子树的左子树元素以此压入栈底,最后左子树的最后一个元素压入栈底之后,再将栈底元素弹出栈,再判断栈底最后一个元素的右子树,利用以上的方法。代码如下:
void prevorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
s.push(_root);
while (!s.empty())
{
BinaryTreeNode<T> *cur = s.top();
cout << cur->_data << " ";
s.pop();
if (cur->_right)
s.push(cur->_right);
if (cur->_left)
s.push(cur->_left);
}
}
非递归实现二叉树中序遍历主要运用stack的先进后出的特点,先把根压入栈里,同时先把左子树的左子树元素以此压入栈底,最后左子树的最后一个元素压入栈底之后,判断栈底最后一个元素的右子树,利用以上的方法。代码如下:
void inorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
BinaryTreeNode<T> *cur = _root;
while (cur||!s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
cout << s.top()->_data << " ";
cur = s.top()->_right;
s.pop();
}
}
非递归实现二叉树后序遍历主要运用stack的先进后出的特点,在利用前序和后序的共同特点
void postorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
BinaryTreeNode<T> *cur = _root;
BinaryTreeNode<T> *prev = NULL;
s.push(cur);
while (cur || !s.empty())
{
while (cur->_left&&cur->_left!=prev)
{
s.push(cur->_left);
cur = cur->_left;
}
if (s.top()->_right&&s.top()->_right != prev)
{
cur = s.top()->_right;
s.push(cur);
}
else
{
cout << s.top()->_data << " ";
prev = s.top();
s.pop();
cur = s.top();
cur->_left =NULL;
}
}
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#实现将数组内元素打乱顺序的方法
- jQuery删除一个元素后淡出效果展示删除过程的方法
- jQuery拖动元素并对元素进行重新排序
- Perl中怎样从数组中删除某个值?
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP的数组中提高元素查找与元素去重的效率的技巧解析
- PHP中return 和 exit 、break和contiue 区别与用法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- javascript学习笔记(十八) 获得页面中的元素代码
- javascript实现在某个元素上阻止鼠标右键事件的方法和实例
- jQuery验证元素是否为空的两种常用方法
- JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
- 浅析return false的正确使用
- javascript中return,return true,return false三者的用法及区别
- jQuery on()绑定动态元素出现的问题小结