二叉树的遍历,递归,迭代,层序,中序,前序,后序

#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
struct node{
	int key;
	node *left, *right;
};
void insertTree(node* &root,int val)
{
	node* tmp = (node*)malloc(sizeof(node));
	tmp->key = val;
	tmp->left = tmp->right = NULL;
	node *q = NULL, *p = root;
	while (p){
		q = p;
		if (p->key > val) p = p->left;
		else if (p->key < val) p = p->right;
		else return;
	}
	if (q == NULL) root = tmp;
	else if (q->key > val) q->left = tmp;
	else q->right = tmp;
}

//非递归遍历
//层序遍历
void printByLevel(node *root)
{
	node *p;
	queue<node*> q;
	q.push(root);
	while (!q.empty()){
		p = q.front(); q.pop();
		if (p){
			printf("%d ", p->key);
			q.push(p->left);
			q.push(p->right);
		}
	}
	printf("\n");
}
//中序遍历
void printByInorder(node* root)
{
	stack<node*> s;
	node *p = root;
	while (p || !s.empty()){
		while (p){
			s.push(p);
			p = p->left;
		}
		if (!s.empty()){
			p = s.top(); s.pop();
			printf("%d ", p->key);
			p = p->right;
		}
	}
	printf("\n");
}
//前序遍历
void printByPreorder(node* root)
{
	stack<node*> s;
	node* p = root;
	while (p||!s.empty()){
		while (p){
			printf("%d ", p->key);
			s.push(p);
			p = p->left;
		}
		if (!s.empty()){
			p = s.top(); s.pop();
			p = p->right;
		}
	}
	printf("\n");
}
//后序遍历
void printByPostorder(node *root)
{
	stack<node*> s;
	node* p = root;
	while (p || !s.empty()){
		while (p){
			printf("%d ", p->key);
			s.push(p);
			p = p->right;
		}
		if (!s.empty()){
			p = s.top(); s.pop();
			p = p->left;
		}
	}
	printf("\n");
}

//递归遍历
void inorder(node* root)
{
	if (root){
		inorder(root->left);
		printf("%d ", root->key);
		inorder(root->right);
	}
}
void preorder(node* root){
	if (root){
		printf("%d ", root->key);
		preorder(root->left);
		preorder(root->right);
	}
}
void postorder(node* root)
{
	if (root){
		postorder(root->left);
		postorder(root->right);
		printf("%d ", root->key);
	}
}
int main()
{
	node *root = NULL;
	int a[] = { 8, 4, 12, 2, 6, 10, 14, 3, 5, 7, 13 };
	for (int i = 0; i < 11; ++i)
		insertTree(root, a[i]);
	printf("Recursive Traversal : inorder preorder postorder\n");
	inorder(root);
	printf("\n");
	preorder(root);
	printf("\n");
	postorder(root);
	printf("\n");

	printf("Iteration Traversal : level inorder preorder postorder\n");
	printByLevel(root);
	printByInorder(root);
	printByPreorder(root);
	printf("Postorder Traversal print in reverse: ");
	printByPostorder(root);
}

  

对于后序遍历的非递归实现,该程序中是以相反的方向输出的,可以使用vector,实现正确方向。

时间: 2024-10-25 18:15:52

二叉树的遍历,递归,迭代,层序,中序,前序,后序的相关文章

C语言非递归实现二叉树的先序、中序、后序、层序遍历

C语言非递归实现二叉树的先序.中序.后序.层序遍历代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 //*****二叉树的二叉链表存储表示*****// 8 typedef struct BiNode 9 { 10 char data; 11 struct BiNode *lchil

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.csdn.net/why850901938/article/details/51052156 首先为了讲解方便,我建立了如图所示的二叉树: 取名为:树A 1.何为层序遍历? 层序遍历就是按照二叉树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右: 以树A为例,层序遍历得到的结果为: 5 2 6 1

二叉树的遍历——前序,中序,后序,层序

二叉树的遍历原因:将序列编程图或者二叉树的形式,确实很直观.但是,最终的处理是交给计算机,计算机的处理只有判断.循环等,也就是只可以处理先行序列.而二叉树的遍历就是将序列的树结构编程线性序列,将线性序列交给计算机处理. 二叉树的遍历大致分为四种:前序遍历.中序遍历.后序遍历,层序遍历. 前序遍历(从上向下):从根节点开始并且取根节点值,遍历根节点的所有左子树以及左子树的所有节点,然后再进行根节点的右子树的遍历.需要注意一点,二叉树的遍历利用递归的思想,也就是每个节点都是根节点,大哥比方,0层的根

二叉树的前序、中序、后序遍历迭代实现

二叉树的前序.中序.后序遍历迭代实现 二叉树的前序遍历,迭代实现 根-左-右 思路: 1. 借用栈的结构 2. 先push(root) 3. node = pop() 3.1.list.add( node.val ) 3.1.push( node.right ) 3.3.push( node.left ) 4.循环步骤3直到栈空 肯定很难理解,我们一步步执行下,请看图 我们来实现一下代码 public List<Integer> preorderTraversal(TreeNode root)

二叉树的前序、中序、后序遍历的递归和非递归算法实现

1 /** 2 * 二叉树的前序.中序.后序遍历的递归和非递归算法实现 3 **/ 4 5 //二叉链表存储 6 struct BTNode 7 { 8 struct BTNode *LChild; // 指向左孩子指针 9 ELEMENTTYPE data; // 结点数据 10 struct BTNode *RChild; // 指向右孩子指针 11 }; 12 13 /** 14 * 前序遍历 15 **/ 16 // 递归实现 17 void PreorderTraversal(BTNo

二叉树高度,以及栈实现二叉树的先序,中序,后序遍历的非递归操作

求解二叉树的高度 树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便. #include <iostream> #include <cstdio> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0; else { int left_h; High(T->lchi

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很

通过二叉树的中序和后序遍历序列构造二叉树(非递归)

题目:通过二叉树的中序和后序遍历序列构造二叉树 同样,使用分治法来实现是完全可以的,可是在LeetCode中运行这种方法的代码,总是会报错: Memory Limit Exceeded ,所以这里还是用栈来实现二叉树的构建. 与用先序和后序遍历构造二叉树的方法类似,但还是要做一些改变: 如果从后往前处理中序和后序的序列,则处理就为如下所示的情况: Reverse_Post: 根-右子树-左子树 Reverse_In: 右子树-根-左子树 这样处理方式和先序-中序就差不多了,只是将添加左孩子的情况

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

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍