二叉树的先序遍历 很有想法的递归与非递归实现
2016-05-14 11:37
344 查看
剧透: 无意间看到的一个不错的二叉树先序例子, 非递归的操作值得看看
二叉树的先序遍历
如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。
遍历结果为:1245367。
1、递归操作:
思想:若二叉树为空,返回。否则
1)遍历根节点;2)先序遍历左子树;3)先序遍历右子树
代码:
2、非递归操作
思想:二叉树的非递归先序遍历,先序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作, 每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。
代码:
或者:
二叉树的先序遍历
如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。
遍历结果为:1245367。
1、递归操作:
思想:若二叉树为空,返回。否则
1)遍历根节点;2)先序遍历左子树;3)先序遍历右子树
代码:
void PreOrder(BiTree root) { if(root==NULL) return ; printf("%c ", root->data); //输出数据 PreOrder(root->lchild); //递归调用,先序遍历左子树 PreOrder(root->rchild); //递归调用,先序遍历右子树 }
2、非递归操作
思想:二叉树的非递归先序遍历,先序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作, 每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。
代码:
void PreOrder_Nonrecursive(BiTree T) //先序遍历的非递归 { if(!T) return ; stack<BiTree> s; s.push(T); while(!s.empty()) { BiTree temp = s.top(); cout<<temp->data<<" "; s.pop(); if(temp->rchild) s.push(temp->rchild); if(temp->lchild) s.push(temp->lchild); } }
或者:
void PreOrder_Nonrecursive(BiTree T) //先序遍历的非递归 { if(!T) return ; stack<BiTree> s; while(T) // 左子树上的节点全部压入到栈中 { s.push(T); cout<<T->data<<" "; T = T->lchild; } while(!s.empty()) { BiTree temp = s.top()->rchild; // 栈顶元素的右子树 s.pop(); // 弹出栈顶元素 while(temp) // 栈顶元素存在右子树,则对右子树同样遍历到最下方 { cout<<temp->data<<" "; s.push(temp); temp = temp->lchild; } } }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php递归创建目录的方法
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件