二叉树是一种树形结构,其特点是每个节点最多有两棵子树,并且子树有左右之分,次序不能随意颠倒。
1二叉树的存储结构
1.1顺序存储结构
完全二叉树:按从上到下,从左往右的顺序存储,n个节点的完全二叉树的节点父子关系:
非根结点(序号 i > 1)的父结点的序号是 i / 2;
结点(序号为i)的左孩子结点的序号是 2i, (若2 i <= n,否则没有左孩子);
结点(序号为i)的右孩子结点的序号是 2i+1, (若2 i +1<= n,否则没有右孩子);
结点 | A | B | O | C | S | M | Q | W | K |
---|---|---|---|---|---|---|---|---|---|
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
一般二叉树也可以采用这种结构,但会造成空间浪费
结点 | A | B | O | M | C | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
1.1链式存储结构
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
//前序遍历
void PreorderTraversal(BinTree BT){
if (BT) {
printf("%d ", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
//中序遍历
void InorderTraversal(BinTree BT){
if (BT) {
InorderTraversal(BT->Left);
printf("%d ", BT->Data);
InorderTraversal(BT->Right);
}
}
//后序遍历
void PostorderTraversal(BinTree BT) {
if (BT) {
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf("%d ", BT->Data);
}
}
//层序遍历
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);
}
}