二叉树的前序遍历-中序遍历-后序遍历

1、遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。二叉树的遍历分为:层次遍历、前序遍历、中序遍历、后序遍历。

二叉树的深度为k,则该二叉树最多有2^k - 1个结点。

层次遍历:这个太简单,,从左到右,从上到下

前序遍历:根节点、左子树、右子树

中序遍历:左子树、根节点、右子树

后序遍历:左子树、右子树、根节点

先来看一个简单示例:


该二叉树的深度为:4。

层次遍历结果:1  2  3  4  5  6  7  8

前序遍历结果:1  2  4  5  7  8  3  6

中序遍历结果:4  2  7  5  8  1  3  6

后序遍历结果:4  7  8  5  2  6  3  1

遍历过程:以中序遍历为例,首先访问左子树(左边叶子节点 )4,即将 1 2 4 依次压栈,直到左子树为空,将4输出(出栈)。然后输出根节点2(出栈),再访问右节点5,5的左子树不为空,压栈;然后访问7,7直接输出,再将5出栈,再访问右节点8, 8的左子树为空直接输出。这样进行依次的输出顺序就是:4 2 7 5 8。

注意:层次遍历需要用队列来实现

2、代码测试

注意:程序主要是对于二叉树结点的存储结构定义和二叉树的创建,最开始自己把BitTree*理解不了。然后翻了下typedef定义的知识,才明白其实就等于 struct BitNode*,一个结构体指针而已,只不过是类型别名。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//***************仅仅做测试,对比struct 和 typedef struct**************
struct node{
	int data;
	struct node *lchild;
	struct node *rchild;
}mynode,*mylistnode;//这里定义的是struct node 对象和 struct node* 对象

void testNode(){

	mynode.data = 10;
	mylistnode = (struct node*)malloc(sizeof(struct node) * 5);
	mylistnode[0].data = 100;
	mylistnode[1].data = 1000;
	printf("test:%d %d %d \n", mynode.data, mylistnode[0].data, mylistnode[1].data);//10 100 1000
}
//******************************************************************


typedef char ElemType;
typedef struct BitNode{
	ElemType data;
	struct BitNode* lchild;//左结点
	struct BitNode* rchild;//右结点
}BitNode, *BitTree;
//这里定义的是类型别名,*修饰类型,而不是对象,即定义了类型别名,等同于struct BitNode*
//等同于typedef BitNode*  BitTree;

void createTree(BitTree &T){
	ElemType indata;
	scanf("%c", &indata);
	if (indata == '#'){
		T = NULL;
	}else{
		T = (BitTree)malloc(sizeof(BitNode));
		if (NULL == T){
			printf("locate memery error.\n");
			return;
		}
		T->data = indata;
		createTree(T->lchild);
		createTree(T->rchild);
	}
}

//先续遍历二叉树
void preOrderTraverse(BitTree T){
	if (T){
		printf("%c ",T->data);
		preOrderTraverse(T->lchild);
		preOrderTraverse(T->rchild);
	}
}
//中序遍历
void midOrderTraverse(BitTree T){
	if (T){
		midOrderTraverse(T->lchild);
		printf("%c ", T->data);
		midOrderTraverse(T->rchild);
	}
}
//后序遍历
void postOrderTraverse(BitTree T){
	if (T){
		postOrderTraverse(T->lchild);
		postOrderTraverse(T->rchild);
		printf("%c ", T->data);
	}
}
/******
				A
           B            C
		D           E      F
	  G  H            I  

	  输入格式为: ABDG##H###CE#I##F##   总数量为2^k - 1个节点  15个
******/
int main(){

	testNode();
	BitTree one;
	printf("按先序序列输入结点序列,输入的是扩展二叉树。'#'代表其子节点空\n");
	createTree(one);
	printf("\n前序遍历:\n");
	preOrderTraverse(one);
	printf("\n中序遍历:\n");
	midOrderTraverse(one);
	printf("\n后序遍历:\n");
	postOrderTraverse(one);
	printf("\n");
	return 0;
}


测试2:


补充:求取二叉树的深度

//求取二叉树的深度:根节点开始为第一层
int getDeep(BitTree T){
	int left, right;
	int h = 0;
	if (T){
		left = getDeep(T->lchild);
		right = getDeep(T->rchild);
		h = left > right ? left : right;
		h = h + 1;
	}
	return h;
}




  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值