二叉树的先序遍历 很有想法的递归与非递归实现
来源:互联网 发布:淘宝网官网国际版 编辑:程序博客网 时间:2024/04/28 17:36
剧透: 无意间看到的一个不错的二叉树先序例子, 非递归的操作值得看看
二叉树的先序遍历
如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。
遍历结果为: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; } } }
1 0
- 二叉树的先序遍历 很有想法的递归与非递归实现
- [二叉树专题]:先序遍历二叉树的递归实现与非递归实现
- 二叉树的先序,中序,层次遍历,递归与非递归实现
- 如何实现二叉树的非递归先序遍历
- 二叉树的先序遍历非递归实现方法
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 二叉树的先序递归以及非递归遍历
- 二叉树的先序递归,非递归遍历
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- C++ 二叉树的遍历---先序遍历(非递归)
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的先序、中序、后续遍历的递归和非递归实现
- 二叉树的先序、中序和后序遍历,递归与非递归方式实现。
- Java实现二叉树的递归与非递归遍历
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 递归与非递归实现二叉树的遍历
- 二叉树的递归与非递归遍历实现
- MapReduce 之PageRank 算法概述、设计思路和源码分析
- Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装
- 手机性能测评之【开机】
- LeetCode|Set Matrix Zeroes
- 解决iOS9更新后http协议和https协议的问题
- 二叉树的先序遍历 很有想法的递归与非递归实现
- wamp配置虚拟主机
- 在线编辑器自动添加<p></p>
- Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
- Servlet3.0之后版本使用Servlet的异步处理
- [容器]STL之set容器详解
- 序言 吐槽
- 甘地自传
- New package not yet registered with the system. Waiting 3 seconds before next attempt解决方案