您的位置:首页 > 其它

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

2017-09-08 18:55 363 查看
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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐