树与二叉树知识点思维导图
树与二叉树代码实现
1 二叉树
1.1 二叉树的存储结构
-
顺序存储 #define MaxSize 100
struct TreeNode{
ElemType value;
bool isEmpty;
};
TreeNode t[MaxSize];
for(int i=0;i<MaxSize;i++){
t[i].isEmpty = true;
}
-
链式存储 struct ElemType{
int value;
};
typeef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree root = NULL;
root = (BiTree) malloc(sizeof(BiTNode));
root->data = {1};
root->lchild = NULL;
root->rchild = NULL;
BiTree *p = (BiTree *) malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;
n个结点的二叉链表共有n+1个空链域
1.2 二叉树的遍历
递归算法
-
先序遍历(根左右) void PreOrder(BiTree T){
if(T!=NULL){
visit(T);
reOrder(T->lchild);
PreOrder(T->rchild);
}
}
-
中序遍历(左根右) void PreOrder(BiTree T){
if(T!=NULL){
reOrder(T->lchild);
visit(T);
PreOrder(T->rchild);
}
}
-
后序遍历(左右根) void PreOrder(BiTree T){
if(T!=NULL){
reOrder(T->lchild);
PreOrder(T->rchild);
visit(T);
}
}
上诉三种算法均可转换为非递归算法 非递归算法–中序转换
void InOrder2(BiTree T){
InStack(S);
BiTree p = T;
while(p||!isEmpty(S)){
if(p){
Push(S,p);
p = p->lchird;
}else{
Pop(S,p);
visit(p);
p = p->rchild;
}
}
}
- 层次遍历
需要借助一个队列void LevelOrder(BiTree T){
InitQueue(Q);
BiTree p;
EnQueue(Q,T);
while(!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if(p->lchild!=NULL)
EnQueue(Q,p->lchird);
if(p->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}
2 线索二叉树
2.1 线索二叉树的存储结构
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadThree;
2.2 线索二叉树的基操
2.2.1 线索二叉树的构造
void InTread(ThreadTree T){
if(T!=NULL){
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
}
void visit(ThreadNode *q){
if(q->lchirld == NULL){
q->lchirld = pre;
q->ltag = 1;
}
if(pre!= NULL&&pre->rchild == NULL){
pre->rchirld = q;
q->rtag = 1;
}
pre = q;
}
void CreatThread(ThreadTree T){
pre = NULL;
if(T!=NULL){
InThread(T);
if(pre->rchild == NULL)
pre->rtag = 1;
}
}
2.2.2 线索二叉树遍历
- 查找中序前驱遍历二叉树
ThreadNode *Lastnode(TheadNode *p){
while(p->ltag==0)
p=p->rchild;
return p;
}
ThreadNode *Prenode(TheadNode *p){
if(p->ltag==0)
return Lastnode(p->lchild);
else
return p->lchild;
}
void RevInorder(TheadNode *T){
for(ThreadNode *p = Lastnode(T);p!=NULL;p=Prenode(p))
visit(p);
}
- 查找中序后继遍历二叉树
ThreadNode *Firstnode(TheadNode *p){
while(p->ltag==0)
p=p->lchild;
return p;
}
ThreadNode *Nextnode(TheadNode *p){
if(p->rtag==0)
return Lastnode(p->rchild);
else
return p->rchild;
}
void Inorder(TheadNode *T){
for(ThreadNode *p = Firstnode(T);p!=NULL;p=Nextnode(p))
visit(p);
}
3 树、森林
3.1 树的存储结构
-
双亲表示法 #define MAX_TREE_SIZE 100
typedef struct{
ElemType data;
int parent;
}PNode;
typedef struct{
PNode node[MAX_TREE_SIZE];
int n;
}PTree;
-
孩子兄弟表示法 typedef struct CSnode{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
3.2 树的先根遍历
伪代码
void PreOrder(TreeNode *R){
if(R!=NULL){
visit(R);
while(R还有下一个子树T)
PreOrder(T);
}
}
4 树的应用
4.1 二叉排序树BST
4.1.1 二叉排序树递归查找
BSTNode *BST_Search(BSTree T,int key){
while(T!=NULL&&key!=T->ley){
if(key < T->key)
T = T->lchild;
else
T = T->rchild;
}
return T;
}
BSTNode *BSTSearch(BiTree T,int key){
if(T!=NULL)
return NULL;
if(key==T->key)
return T;
else if(key < T->key)
return BSTSearch(T->lchild,key);
else
return BSTSearch(T->rchild,key);
}
4.1.2 二叉排序树非递归查找
BSTNode *BST_Search(BiTree T,ElemType key,BiTNode *&p){
p = NULL;
while (T != NULL && key != T->data) {
p = T;
if (key < T->data)
T= T->lchild;
else
T=T->rchild;
}
return T;
}
4.1.3 二叉排序树插入
int BST_Insert(BiTree &T,KeyType k){
if(T==NULL){
T=(BiTree)malloc(sizeof(BSTNode));
T->key = k ;
T->lchild = T->rchild = NULL;
return 1;
}
else if(k==T->key)
return 0;
else if(k < T->key)
return BST_Insert (T->lchild,k);
else
return BST_Insert (T->rchild,k);
}
4.1.4 二叉排序树构造
void Creat_BST(BiTree &T,KeyType str[],int n){
T = NULL;
int i = 0;
while (i < n){
BST_Insert(T, str[i]);
i++;
}
}
4.2 平衡二叉树AVL
4.2.1 平衡二叉树的存储结构
typedef struct AVLNode{
int key;
int blance;
struct AVLNode *lchild,*rchild;
}AVLNode,*AVLTree;
|