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 -1struct 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;
}