4.3 二叉树

二叉树的链表结构

typedef Struct TNode *Position;
typedef Position BinTree;
struct TNode
{
	ElementType Data;
	BinTree Left;
	BinTree Right;
}

类型名称:二叉树(BinTree)

数据对象集:一个有穷的结点集合。由根结点和左右二叉子树组成

操作集:

1.二叉树的遍历

(1)中序遍历(左-根-右)(第二次遇到输出)

void InorderTraversal(BinTree BT)
{
	if(BT)
	{
		/*假设数据为整型且对BT结点的访问就是打印数据*/ 
		InorderTraversal(BT->Left);
		printf("%d",BT->Data);
		InorderTraversal(BT->Right);
	}
}

 (2)先序遍历(第一次遇到输出)

void PreorderTraversal(BinTree BT)
{
	if(BT)
	{
		/*假设数据为整型且对BT结点的访问就是打印数据*/ 
		printf("%d",BT->Data);
		InorderTraversal(BT->Left);
		InorderTraversal(BT->Right);
	}
}

(3)后序遍历(第三次遇到输出)

void PostorderTraversal(BinTree BT)
{
	if(BT)
	{
		/*假设数据为整型且对BT结点的访问就是打印数据*/ 
		InorderTraversal(BT->Left);
		InorderTraversal(BT->Right);
		printf("%d",BT->Data);
	}
}

(4)非递归中序遍历(堆栈)

void InorderTraversal(BinTree BT)
{
	BinTree T;
	Stack S=CreateStack();
	T=BT;
	while(T||IsEmpty(S))
	{
		while(T)
		{
			Push(S,T);
			T=T->Left;
		}
		T=Pop(S);
		peintf("%d",T->Data);
		T=T->Right;
	}
}

(5)层序遍历

void LeveLorderTraversal(BinTree BT)
{
	Queue Q;
	BinTree T;
	
	if(!BT)return;
	
	Q=CreatQueue();
	AddQ(Q,BT);
	while(!IsEmpty(Q))
	{
		T=DeleteQ(Q);
		printf("%d",T->Data);
		if(T->Left) AddQ(Q,T->Left);
		if(T->Right) AddQ(Q,T->Right);
	}
}

2.二叉树的创建

typedef int ElementType;     /*假设结点数据为整数*/ 
#define NOInfo 0;    /*用0表示没有结点*/ 

BinTree CreatBinTree()
{
	ElementType Data;
	BinTree BT,T;
	Queue Q=CreatQueue();
	
	scanf("%d",&Data);
	if(Data!=NoInfo)
	{
		BT=(BinTree)malloc(sizeof(sturct TNode));
		BT->Data=Data;
		BT->Left=BT->Right=NULL;     /*把两个子结点设为空*/ 
		AddQ(Q,BT);
	}
	else return NULL;
	while(!IsEmpty(Q))
	{
		T=DeleteQ(Q);      /*从队列中取出一结点地址*/ 
		scanf("%d",&Data);
		if(Data==NoInfo)T->Left=NULL;
		else  /*分配新结点,作为出队结点左孩子;新结点入队*/ 
		{
			T->Left=(BinTree)malloc(sizeof(sturct TNode));
			T->Left->Data=Data;
			T->Left->Left=T->Left->Right=NULL;
			AddQ(Q,T->Left);
		}
		scanf("%d",&Data);
		if(Data==NoInfo)T->Right=NULL;
		else  /*分配新结点,作为出队结点右孩子;新结点入队*/ 
		{
			T->Right=(BinTree)malloc(sizeof(sturct TNode));
			T->Right->Data=Data;
			T->Right->Left=T->Right->Right=NULL;
			AddQ(Q,T->Right);
		}
	}
	return BT;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值