非递归实现树的遍历

【代码】

#include <iostream>
#include <stack>
using namespace std;

typedef struct Node{
	char key;
	struct Node *lchild, *rchild;
}*Tree, TNode;

void PreOrder(Tree T) //先序遍历
{
	if (T == NULL)
		return;
	TNode *curr = T;
	//TNode *tmp;
	stack<Tree> s;
	while (curr != NULL || !s.empty()) {
		if (curr != NULL) {
			cout<<curr->key;
			s.push(curr);
			curr = curr->lchild;
		}
		else {
			curr = s.top();
			s.pop();
			curr = curr->rchild;
		}
	}
	/*
	while (curr != NULL) {
		cout<<curr->key;
		s.push(curr);
		curr = curr->lchild;
	}
	while(!s.empty()) {
		curr = s.top();
		s.pop();
		tmp = curr->rchild;
		while(tmp != NULL) {
			cout<<tmp->key;
			s.push(tmp);
			tmp = tmp->lchild;
		}
	}
	*/
}

void InOrder(Tree T)  //中序遍历
{
	if (T == NULL)
		return;
	TNode *curr = T;
	//TNode *tmp;
	stack<Tree> s;
	while ((curr != NULL) || !s.empty()) {
		if (curr != NULL) {
			s.push(curr);
			curr = curr->lchild;
		}
		else {
			curr = s.top();
			cout<<curr->key;
			s.pop();
			curr = curr->rchild;
		}
	}

}

void PostOrder(Tree T) //后序遍历
{
	if (T == NULL)
		return ;
	TNode *curr = T, *pre = NULL;
	stack<Tree> s;
	while (curr != NULL || !s.empty()) {
		if (curr != NULL) {
			s.push(curr);
			curr = curr->lchild;
		}
		else {
			curr = s.top();
			s.pop();
			if (curr->rchild != NULL && curr->rchild != pre) {
				s.push(curr);
				curr = curr->rchild;
			}
			else {
				cout<<curr->key;
				pre = curr;
				curr = NULL;
			}
		}
	}
}

Tree createTree(char *s, int n, int i) //建树
{
	if (i >= n)
		return NULL;
	TNode *curr;
	curr = (TNode *)malloc(sizeof(TNode));
	curr->key = s[i];

	curr->lchild = createTree(s, n, 2*(i+1)-1);
	curr->rchild = createTree(s, n, 2*(i+1));
	return curr;
}

void freeTree(Tree T)  //释放
{
	if (T != NULL){
		freeTree(T->lchild);
		freeTree(T->rchild);
		delete T;
	}
}

int main(void)
{
	char s[] = "ABCDEFG";
	Tree T;
	T = createTree(s, 7, 0);
	InOrder(T);
	cout<<endl;
	PreOrder(T);
	cout<<endl;
	PostOrder(T);
	cout<<endl;
	freeTree(T);
	return 0;
}
时间: 2024-10-09 14:48:12

非递归实现树的遍历的相关文章

二叉树的存储方式以及递归和非递归的三种遍历方式

树的定义和基本术语 树(Tree)是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件: (1)有且仅有一个特定的称为根(Root)的结点: (2)其余的结点可分为m(m>=0)个互不相交的子集T1,T2,T3-Tm,其中每个子集又是一棵树,并称其为子树(Subtree). 树形结构应用实例: 1.日常生活:家族谱.行政组织结构:书的目录 2.计算机:资源管理器的文件夹: 编译程序:用树表示源程序的语法结构: 数据库系统:用树组织信息: 分析算法:用树来描述其执行过程:

非递归实现二叉树的遍历(前序、中序、后序)

树的定义本是递归定义,所以采用递归的方法实现遍历算法,更加让人理解,且代码简单方便.若采用非递归的方法实现,须得利用栈模拟实现. 栈的特点(后进先出) 非递归实现二叉树的前序遍历: 原理如图所示: 参考代码如下: void _PrevOrder(Node* root)//非递归实现前序遍历 { stack<Node*> s; if(root == NULL) return; s.push(root); while (!s.empty()) { root = s.top(); cout<&

非递归实现先序遍历 java leecode 提交

写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈.2.因为栈顶的节点的左孩子为空,所以栈顶的的节点的左子树肯定访问完毕,所以出栈后直接指向右孩子.其实这里面有个思想迭代和递归的本质相同之处是什么?以后会写一篇我的思考. public class Solution { public List<Integer> preorderTraversal(T

非递归线段树专题

学习了自底向上的非递归线段树,深感精妙!! 大牛的博客:http://blog.csdn.net/zearot/article/details/48299459 张坤玮---统计的力量 The Union of k-Segments CodeForces - 612D 题意:求被覆盖k次及以上的点或者线段. 看到别人直接用扫描线写的,更方便一些. 不过拿来练习线段树也不错. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const in

[C++]LeetCode: 93 Binary Search Tree Iterator (经典题,非递归的中序遍历)

题目: Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Note: next() and hasNext() should run in average O(1) time and u

非递归线段树区间修改区间求和的两种实现(以POJ 3468为例)

题意:就是一个数列,支持  查询区间和  以及  区间内的数都加上 C . 递归线段树很好写,就不讲了. 递归版本        : 内存:6500K   时间:2.6 秒 非递归版本一: 内存:4272K   时间:1.1秒 非递归版本二: 内存:4272K   时间:1.3秒 -------------------------------------------------------------------------------------------------------------

二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历

对于一种数据结构而言,遍历是常见操作.二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树.二叉树的节点声明如下: 1 typedef struct TreeNode *PtrToNode; 2 typedef struct TreeNode *BinTree; 3 4 struct TreeNode 5 { 6 int Data; //为简单起见,不妨假设树节点的元素为int型 7 BinTree Left; 8 BinTree Right; 9 }; 二叉树的遍历主要有先序遍历

[LeetCode] Binary Tree Preorder Traversal (非递归的先序遍历)

Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,2,3]. Note: Recursive solution is trivial, could you do it iteratively 解题思路: 二叉树的前序遍历.

非递归实现树的前序遍历

/*binary-tree-postorder-traversal*/ /***************************/ /* Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree{1,#,2,3}, 1 2 / 3 return[3,2,1]. Note: Recursive solution is trivial, could