树的概念
树的定义
树的性质
树中的结点数等于所有结点的度数加1。度为m的树中第i层上至多有mi-1个结点。高度为h的m叉树至多有(mh-1)/(m-1)个结点。具有n个结点的m叉树的最小高度为[logm(n(m-1)+1)] (向上取整)总结点数 = n0+n1+ … +nm 。总分支数 = 1n1+2n2+3n3+ … +mnm 。总结点数 = 总分支数 + 1 。
二叉树的概念
二叉树的定义
每个结点至多有两棵子树,并且两棵子树有左右之分,次序不能颠倒。与度为2的有序树的区别:特殊的二叉树:
满二叉树:高度为h,含有2h-1个结点的二叉树。完全二叉树:高度为h、有n个结点的二叉树,每个结点都与高度为h的满二叉树中编号1~n的结点一一对应。二叉排序树:左子树上的所有结点的关键字均小于根结点的关键字,右子树上所有结点的关键字均大于根结点的关键字的二叉树。平衡二叉树:树上任意结点的左子树和右子树的深度之差不超过1。
二叉树的性质
非空二叉树上叶子结点数等于度为2的结点数加1,即n0=n2+1(结点数为n,则边数为n-1) 。非空二叉树上第k层上之多有2k-1个结点 。高度为h的二叉树至多有2h-1个结点。完全二叉树的性质:
当i>1时,结点i的双亲编号为[i/2] (向下取整),即当i为偶数时,双亲编号为i/2(结点i是双亲的左孩子);当i为奇数时,双亲编号为(i-1)/2(结点i是双亲的右孩子)。当2i<=n时,结点i的左孩子编号为2i,否则无左孩子;当2i+1<=n时,结点i的右孩子的编号为2i+1,否则无右孩子。结点i所在的层次为[log2i]+1(向下取整)。 -具有n个结点的完全二叉树的高度为[log2(n+1)] (向上取整)或[log2n]+1 (向下取整) 。
二叉树的存储结构
顺序存储结构
#define MaxSize 1000
struct TreeNode{
ElemType value;
bool isEmpty;
};
TreeNode t[MaxSize];
for(int i=0; i<MaxSize; i++){
t[i].isEmpty = true;
}
链式存储结构
typedef struct BiTNode
{
ElemType data;
struct BitNode *lchild, *rchild;
}BiTNode,*BiTree;
typedef 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;
BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;
void visit(BiTNode *p){
printf("%c", p->data);
}
遍历操作
void PreOrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void PreOrder(BiTree T){
InitStack(S);
BiTree p=T;
while(p || !IsEmpty(S)){
if(p){
visit(p);
Push(S, p);
p = p->lchild;
}
else{
Pop(S,p);
p = p->rchild;
}
}
}
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
void InOrderNonRecursion(BiTree T){
InitStack(S);
BiTree p = T;
while(p || !IsEmpty(S)){
if(p){
Push(S, p);
p = p->lchild;
}
else{
Pop(S, p);
visit(p);
p = p->rchild;
}
}
}
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
void PostOrderNonRecursion(BiTree T){
InitStack(S);
BiTree p = T;
BiTree r = NULL;
while(p || !Empty){
if(p){
Push(S, p);
p = p->lchild;
}
else{
GetTop(S, p);
if(p->rchild && p->rchild!=r){
p = p->rchild;
Push(S, p);
p = p->lchild;
}
else{
Pop(S, p);
visit(p);
r = p;
p=NULL;
}
}
}
}
void LevelOrder(BiTree T){
LinkQueue Q;
InitQueue(Q);
BiTree p;
EnQueue(Q,T);
while (!isEmpty(Q))
{
DeQueue(Q,p);
visit(p);
if(p->lchild!=NULL)
EnQueue(Q, p->lchild);
if(p->rchild!=NULL)
EnQueue(Q, p->rchild);
}
}
int treeDepth(BiTree T){
if(T = NULL)
return 0;
else{
int l = treeDepth(T->lchild);
int r = treeDepth(T->rchild);
return l>r ? l+1 : r+1;
}
}
线索二叉树
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
}ThreadNode, *ThreadTree;
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
void visit(BiTNode *q){
if(q=p)
final = pre;
else
pre = q;
}
BiTNode *p;
BiTNode *pre = NULL;
BiTNode *final = NULL;
ThreadNode *pre=NULL;
void Inthread(ThreadTree T){
if(T!=NULL){
Inthread(T->lchild);
visit(T);
Inthread(T->rchild);
}
}
void visit(ThreadNode *q){
if(q->lchild==NULL){
q->lchild = pre;
q->ltag = 1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
void CreateInThread(ThreadTree T){
pre = NULL;
if(T!=NULL){
InThread(T);
if(pre->rchild == NULL)
pre->rtag=1;
}
}
void InThread(ThreadTree p, ThreadTree &pre){
if(p!=NULL){
InThread(p->lchild, pre);
if(p->lchild==NULL){
p->lchild = pre;
p->ltag = 1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
InThread(p->rchild, pre);
}
}
void CreateInThread(ThreadTree T){
ThreadTree pre = NULL;
if(T!=NULL){
InThread(T, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
ThreadNode *pre = NULL;
void CreatePreThread(ThreadTree T){
pre = NULL;
if(T!=NULL){
PreThread(T);
if(pre->rchild==NULL)
pre->rtag = 1;
}
}
void PreThread(ThreadTree T){
if(T! = NULL){
visit(T);
if(T->rtag == 0)
PreThread(T->rchild);
}
}
void visit(ThreadNode *q){
if(q->lchild == NULL){
q->lchild = pre;
q->rtag = 1;
}
if(pre!=NULL && pre->rchild==NULL){
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
void PreThread(ThreadTree p, ThreadTree &pre){
if(p!=NULL){
if(p->lchild == NULL){
p->lchild = pre;
p->ltag = 1;
}
if(pre!=NULL && pre->rchild==NULL){
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
if(p->ltag = 0)
InThread(p->rchild, pre);
Inthread(p->rchild, pre);
}
}
void CreateThread(ThreadTree T){
ThreadTree pre = NULL;
if(T!=NULL){
PreThread(T, pre);
if(pre->rchild==NULL)
pre->rtag = 1;
}
}
ThreadNode *pre=NULL;
void CreatePostThread(ThreadTree T){
pre = NULL;
if(T!=NULL){
InThread(T);
if(pre->rchild==NULL)
pre->rtag = 1;
}
}
void PostThread(ThreadTree T){
if(T!==NULL){
PostThread(T->lchild);
PostThread(T->rchild);
visit(T);
}
}
void visit(ThreadNode *q){
if(q->lchild == NULL){
q->lchild=pre;
q->rtag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=q;
pre->rtag=1;
}
pre = q;
}
void PostThread(ThreadTree p, ThreadTree &pre){
if(p!=NULL){
InThread(p->lchild, pre);
InThread(p->rchild, pre);
if(p->lchild==NULL){
p->lchild = pre;
p->ltag = 1;
}
if(pre!=NULL && pre->rchild==NULL){
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
}
}
void CreatePostThread(ThreadTree T){
ThreadTree pre=NULL;
if(T!=NULL){
PostThread(T, pre);
if(pre->rchild==NULL)
pre->rtag = 1;
}
}
转载请注明原文地址:https://blackberry.8miu.com/read-36909.html