樹(tree)
樹的存儲結構
1.雙親表示法
typedef struct treeNode
{
int data;
int parent;
}treeNode;
typedef struct tree
{
treeNode nodes[MAX_TREE_SIZE];
int root,n;//根的位置和結點數目;
}tree;
2.孩子表示法
typedef struct chileNode//孩子結點
{
int child;
struct childNode *next;
}*childPtr;
typedef struct rootNode//表所記錄的根結點
{
int data;
childPtr *firstChild;
}rootNode;
typedef struct tree//樹結構
{
rootNode nodes[MAX_TREE_SIZE];//結點數組
int root,n;//根的位置和結點數目;
}tree;
還可以附設一個域表示其雙親的位置,這樣不僅可以知道孩子的位置,還可以知道其雙親的位置(孩子雙親表示法)。
3.孩子兄弟表示法
typedef struct treeNode
{
int data;
struct treeNode *firstchild,*rightsib;/* data */
}treeNode,*treePtr;
二叉樹
- 在二叉樹的i層上至多有2^(i-1)個結點(i>=1)
- 深度爲k的二叉樹至多有2^k-1個結點(k>=1)
- 對任何一顆二叉樹T,如果其終端結點數爲n0,度爲2的節點數爲n2,則n0 = n2 +1
滿二叉樹
一顆深度爲k的二叉樹有2^k-1個結點的二叉樹稱爲滿二叉樹。
完全二叉樹
二叉樹的存儲結構
typedef struct BiNode
{
chat data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
遍歷二叉樹
若樹爲空,則空操作,否則:
訪問根節點;先序遍歷左子樹;先序遍歷右子樹。
中序遍歷二叉樹:
若樹爲空,則空操作,否則:
中序遍歷左子樹;訪問根節點;中序遍歷右子樹。
後序遍歷二叉樹:
若樹爲空,則空操作,否則:
後序遍歷左子樹;後序遍歷右子樹;訪問根節點;
typedef struct BiNode
{
chat data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
//前序遍歷二叉樹void preOrderTraverse(BiTree T)
{
if(NULL==T)
return;
printf("%c",T->data);
preOrderTraverse(T->lchild);
preOrderTraverse(T->rchild);
}
//前序遍歷創建二叉樹
void creatTree(BiTree *tree)//傳入指向指針的指針才能修改指針的值
{
char c;
scanf("%c",&c);
if(' '==c)
{
*tree=NULL ;
}
else
{
*tree=(BiTree)malloc(sizeof(BiNode));
(*tree)->data=c;
creatTree(&(*tree)->lchild);
creatTree(&(*tree)->rchild);
}
return;
}