数据结构--第六章 遍历二叉树

本文介绍了二叉树的三种遍历方式:先序遍历、中序遍历和后序遍历,并提供了递归与非递归的代码实现。通过示例展示了不同遍历顺序下的节点访问路径,帮助理解二叉树遍历的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.二叉树的先序遍历:

若二叉树为空,则空操作;否则

(1)访问根节点;

(2)先序遍历左子树;

(3)先序遍历右子树;

2.二叉树的中序遍历:

若二叉树为空,则空操作;否则

(1)中序遍历左子树;

(2)访问根节点;

(3)中序遍历右子树;

3.二叉树的后序遍历:

若二叉树为空,则空操作;否则

(1)后序遍历左子树;

(2)后序遍历右子树;

(3)访问根节点;




如上图:

该二叉树的先序序列:

A B C D E G F

中序序列:

C B E G D F A

后序序列:

C G E F D B A

一下代码包括的内容有:

1.先序创建二叉树

2.递归实现二叉树的先序遍历,中序遍历,后序遍历。

3.非递归实现二叉树的三种遍历(详细参考http://blog.youkuaiyun.com/kofsky/article/details/2886453

//BinaryTree.cpp
#ifndef BINARYTREE_H
#define BINARYTREE_H

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
#define OK 1
#define OVERFLOW  -2
#define Status  bool
#define TRUE  1
#define FALSE 0
#define ERROR 0

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	bool flag;       //设置标志位非递归实现后序遍历有用
	struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;
Status PreCreateBiTree(BiTree &T);    //按先序序列创建二叉树
Status PreOrderTraverse(BiTree T, Status (* visit)(TElemType e));
Status InOrderTraverse(BiTree T, Status (* visit)(TElemType e));
Status PostOrderTraverse(BiTree T, Status (* visit)(TElemType e));
Status LevelOrderTraverse(BiTree T, Status (* visit)(TElemType e));
//以非递归的方式中序遍历二叉树
Status InOrderTraverse2(BiTree T, Status (* visit)(TElemType e));
//以非递归的方式先序遍历二叉树
Status PreOrderTraverse2(BiTree T, Status (* visit)(TElemType e));
//以非递归的方式后续遍历二叉树
Status PostOrderTraverse2(BiTree T, Status (*visit)(TElemType e));
#endif
//BinaryTree.cpp
#include "BinaryTree.h"
#include "C:\Users\jinchunpeng\Desktop\数据结构\Stack\Stack\Stack.h"  //见以前的博文
#include <stdio.h>
#include <stdlib.h>

Status PreCreateBiTree(BiTree &T)
{
	char ch;
	scanf("%c", &ch);
	if (ch == ' ')   T = NULL;
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode));
		T->data = ch;
		PreCreateBiTree(T->lchild);
		PreCreateBiTree(T->rchild);
	}
	return OK;
}

Status PreOrderTraverse(BiTree T, Status (* visit)(TElemType e))
{
	if (T)
	{
		visit(T->data);
		PreOrderTraverse(T->lchild, visit);
		PreOrderTraverse(T->rchild, visit);
	}
	return OK;
}

Status PostOrderTraverse(BiTree T, Status (* visit)(TElemType e))
{
	if (T)
	{
		PostOrderTraverse(T->lchild, visit);
		PostOrderTraverse(T->rchild, visit);
		visit(T->data);
	}
	return OK;
}

Status InOrderTraverse(BiTree T, Status (* visit)(TElemType e))
{
	if (T)
	{
		InOrderTraverse(T->lchild, visit);
		visit(T->data);
		InOrderTraverse(T->rchild, visit);
	}
	return OK;
}

Status InOrderTraverse2(BiTree T, Status (* visit)(TElemType e))
{
	SqStack<BiTree> S;
	S.InitStack();
	BiTree p = T;
	while (p || !S.StackEmpty())
	{
		if (!p)
		{
			S.Push(p);
			p = p->lchild;
		}
		else
		{
			
			S.Pop(p);
			if ( !visit(p->data) )  return ERROR;
			p = p->rchild;
		}
	}
	return OK;
}

Status PreOrderTraverse2(BiTree T, Status (* visit)(TElemType e))
{
	SqStack<BiTree> S;
	S.InitStack();
	BiTree p = T;
	while (p || !S.StackEmpty())
	{
		if (!p)
		{
			visit(p->data);
			S.Push(p);
			p = p->lchild;
		}
		else
		{
			S.Pop(p);
			p = p->rchild;
		}
	}
	return OK;
}

Status PostOrderTraverse2(BiTree T, Status (* visit)(TElemType e))
{
	BiTree p = T;
	p->flag = FALSE;
	SqStack<BiTree> S;
	S.InitStack();
	if (p)
	{
	    S.Push(p);
	}
	while (!S.StackEmpty())
	{
		S.Pop(p);
		if (p->flag)
		{
			visit(p->data);
		}
		else
		{
			S.Push(p);
			p->flag = TRUE;
			if (p->rchild)
			{
				p->rchild->flag = FALSE;
				S.Push(p->rchild);
			}
			if (p->lchild)
			{
				p->lchild->flag = FALSE;
				S.Push(p->lchild);
			}
		}
	}
	return OK;
}

运行结果:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值