二叉树的前序遍历-中序遍历-后序遍历
2017-09-08 18:55
363 查看
1、遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。二叉树的遍历分为:层次遍历、前序遍历、中序遍历、后序遍历。
二叉树的深度为k,则该二叉树最多有2^k - 1个结点。
层次遍历:这个太简单,,从左到右,从上到下
前序遍历:根节点、左子树、右子树
中序遍历:左子树、根节点、右子树
后序遍历:左子树、右子树、根节点
先来看一个简单示例:
![](http://img.blog.csdn.net/20170908171553206?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdmdWxpYW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
该二叉树的深度为: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;
}
![](http://img.blog.csdn.net/20170910111246848?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdmdWxpYW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
测试2:
![](http://img.blog.csdn.net/20170910111542294?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdmdWxpYW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
补充:求取二叉树的深度
//求取二叉树的深度:根节点开始为第一层
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;
}
二叉树的深度为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;
}
相关文章推荐
- 二叉树的前序遍历,中序遍历和后序遍历(c#)
- 二叉树的前序遍历、中序遍历和后序遍历及其算法
- 二叉树的前序遍历、中序遍历和后序遍历及其算法
- 二叉树的前序遍历、中序遍历和后序遍历及其算法
- 二叉树的前序遍历、中序遍历和后序遍历及其算法
- 二叉树的前序遍历、中序遍历、后序遍历概念
- 给定二叉树的前序遍历结果,输出所有可能的中序遍历的结果
- 由树的前序遍历,中序遍历建立一颗二叉树,并以后续遍历的方式输出其元素
- 二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种)
- 中序线索化的线索二叉树的前序遍历、中序遍历和后序遍历
- 二叉树经典面试题解析一:用非递归实现二叉树的前序遍历,中序遍历,后序遍历
- 二叉树的前序遍历,中序遍历,后序遍历代码
- 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
- 二叉树的基本操作,前序遍历,后续遍历,中序遍历
- 关于二叉树的前序遍历、中序遍历、删除元素、插入元素
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- 由二叉树的中序遍历, 前序遍历, 构建二叉树
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- LintCode:二叉树的前序遍历、中序遍历、后序遍历
- 由前序遍历序列跟中序遍历序列生成二叉树,如果输入序列不正确返回fail~ 如果正确则前序遍历创建的二叉树