数据结构学习笔录--二叉树的遍历

二叉树是一种重要的数据结构,总体来讲它是由根节点和左子树、右子树组成,具有几种不同的形态,分别是空树、只有根节点、只有根节点和左子树、只有根节点和右子树、有根节点以及左右子树。二叉树的左右子树是具有左右区分的。二叉树还具有一些特殊的结构,如斜二叉树、完全二叉树和完美二叉树,遍历一颗二叉树一般有四种方法,先序遍历、中序遍历、后序遍历和层序遍历。

1、二叉树的几个重要性质

(1)一个二叉树第i层最多节点数为2^(i-1),i>=1;

(2)深度为k的二叉树最大节点总数2^k-1;

(3)对任何非空的二叉树,如果其叶子节点数为n0,度为2的节点数为n2,则有关系试n0=n2+1成立。

2、二叉树遍历的递归算法

(1)抽象数据类型定义

typedef struct TreeNode{
	int data;
	struct TreeNode *Left;
	struct TreeNode *Right;
}BinTree;

(2)遍历算法接口

BinTree* creatBinTree();  --创建一颗树
void PreOrderTraversal(BinTree *BT); --先序遍历二叉树
void MidOrderTraversal(BinTree *BT); --中序遍历二叉树
void PostOrderTraversal(BinTree *BT); --后序遍历二叉树

(3)算法代码

BinTree* creatBinTree()
{
	BinTree *BT;
	BT=(BinTree*)malloc(sizeof(BinTree));
	BT->Left=NULL;
	BT->Right=NULL;
	return BT;
}

void PreOrderTraversal(BinTree *BT)
{
	if(BT!=NULL)
	{	
		printf("%d ",BT->data);
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);	
	}
}
void MidOrderTraversal(BinTree *BT)
{	
	if(BT!=NULL)
	{		
		PreOrderTraversal(BT->Left);
		printf("%d ",BT->data);
		PreOrderTraversal(BT->Right);	
	}	
}
void PostOrderTraversal(BinTree *BT)
{	
	if(BT!=NULL)
	{		
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
		printf("%d ",BT->data);	
	}
}
int main()
{
	BinTree *BT=creatBinTree();
	BT->data=12;
	PreOrderTraversal(BT);
	return 0;
}

3、二叉树的非递归算法

非递归算法需要借助堆栈实现,堆栈的实现这里直接使用。

void PreOrderTraversal(BinTree *BT)
{
	BinTree *T;
	stack *s=createStack();
	while(T!=NULL)
	{
		while(T)
		{
			Push(s,T);
			printf("%d ",T->data);
			T=T->Left;
		}
		if(!isEmpty(s))
		{
			T=Pop(s);
			
			T=T->Right;
		}
	}
}
void MidOrderTraversal(BinTree *BT)
{	
	BinTree *T;
	stack *s=createStack();
	while(T!=NULL)
	{
		while(T)
		{
			Push(s,T);
			T=T->Left;
		}
		if(!isEmpty(s))
		{
			T=Pop(s);
			printf("%d ",T->data);
			T=T->Right;
		}
	}
}

//思路:使用根-右-左的顺序先序遍历,压到另外一个堆栈中,然后倒序输出。 
void PostOrderTraversal(BinTree *BT)
{	
	BinTree *T;
	stack *s=createStack();
	stack *q=createStack();
	while(T!=NULL)
	{
		while(T)
		{
			Push(s,T);
			Push(q,T);	//压进堆栈,便于倒序输出 
			T=T->Right;
		}
		if(!isEmpty(s))
		{
			T=Pop(s);		
			T=T->Left;
		}
	}
	while(!isEmpty(q))//倒序输出  
	{
		BinTree *re=Pop(q);
		printf("%d ",re->data);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值