3.1 树与数的表示
3.1.1 顺序查找
int SequentialSearch(List Tbl,ElementType K){
int i;
Tbl->Element[0]=K;
for(i=Tbl->Length;Tbl->Element[i]!=K;i--);
return i;
}
typedef struct LNode *List;
struct LNode{
ElementType Element[MAXSIZE];
int Length;
};
3.1.2 二分查找例子
3.1.3 二分查找实现
int BinarySearch(List Tbl,ElementType K){
int left,right,mid,NoFound=-1;
left=1;
right=Tbl->Length;
while(left<=right){
mid=(left+right)/2;
if(K<TBl->Element[mid]){
right=mid-1;
}else if(K>Tbl->Element[mid]){
left=mid+1;
}else{
return mid;
}
return NotFound;
}
}
3.1.4 树的定义和术语
3.1.5 树的表示
3.2 二叉树及存储结构
3.2.1 二叉树的定义及性质
3.2.2 二叉树的存储结构
3.3 二叉树的遍历
3.3.1 先序中序后序遍历
//先序遍历
void PreOrderTraversal(BinTree BT){
if(BT){
printf("%d",BT->Data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
//中序遍历
void InOrderTraversal(BinTree BT){
if(BT){
PreOrderTraversal(BT->Left);
printf("%d",BT->Data);
PreOrderTraversal(BT->Right);
}
}
//后序遍历
void PostOrderTraversal(BinTree BT){
if(BT){
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
printf("%d",BT->Data);
}
}
3.3.2 中序非递归遍历
基本思路:使用堆栈
//中序遍历非递归
void InOrderTraversal(BinTree BT){
BinTree T=BT;
Stack S=CreateStack(MaxSize){
while(T||!IsEmpty(S)){
while(T){
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);
printf("%5d",T->Data);
T=T->Right;
}
}
}
}
//先序遍历非递归
void PreOrderTraversal(BinTree BT){
BinTree T=BT;
Stack S=CreateStack(MaxSize){
while(T||!IsEmpty(S)){
while(T){
Push(S,T);
printf("%5d",T->Data);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);
T=T->Right;
}
}
}
}
3.3.3 层序遍历
//层序遍历
void LevelOrderTraversal(BinTree BT){
Queue Q;
BinTree T;
if(!BT){
return;
}
Q=CreateQueue(MaxSize);
AddQ(Q,BT);
while(!IsEmptyQ(Q)){
T=DeleteQ(Q);
printf("%d\n",T->Data);
if(T->Left){
AddQ(Q,T->Left);
}
if(T->Right){
AddQ(Q,T->Right);
}
}
}
3.3.4 遍历应用例子
小白专场
#include <stdio.h>
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1
struct TreeNode{
ElementType Element;
Tree Left;
Tree Right;
}T1[MaxTree],T2[MaxTree];
Tree BuildTree(struct TreeNode T[]){
Tree Root;
int N,i,t;
scanf("%d",&N);
int check[MaxTree];
char cl,cr;
if(N){
for(t=0;t<N;t++){
check[t]=0;
}
for(i=0;i<N;i++){
scanf(" %c %c %c",&T[i].Element,&cl,&cr);
if(cl!='-'){
T[i].Left=cl-'0';
check[T[i].Left]=1;
}else{
T[i].Left=Null;
}
if(cr!='-'){
T[i].Right=cr-'0';
check[T[i].Right]=1;
}else{
T[i].Right=Null;
}
}
for(t=0;t<N;t++){
if(!check[t]){
break;
}
}
Root=t;
}
return Root;
}
int lsomorphic(Tree R1,Tree R2){
if((R1==Null)&&(R2==Null)){//全空
return 1;
}
if((R1==Null)&&(R2!=Null)){//一个空一个不空
return 0;
}
if(T1[R1].Element!=T2[R2].Element){//当前值不同
return 0;
}
if((T1[R1].Left==Null)&&(T2[R2].Left==Null)){//都没有左子树
return lsomorphic(T1[R1].Right,T2[R2].Right);
}
if(((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&&((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element))){//都存在左子树且值相同,则递归判断左子树和右子树是否同构
return (lsomorphic(T1[R1].Left,T2[R2].Left)&&lsomorphic(T1[R1].Right,T2[R2].Right));
}else{
return (lsomorphic(T1[R1].Left,T2[R2].Right)&&lsomorphic(T1[R1].Right,T2[R2].Left));//否则判断相互左右子树是否同构
}
}
int main(){
Tree R1,R2;
R1=BuildTree(T1);
R2=BuildTree(T2);
if(lsomorphic(R1,R2)){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}