2017年学习的数据结构作的笔记,一些算法思想(伪代码实现)在日常学习中仍显得很重要,很多很多,在此记录整理不断补充,反复看反复理解反复记忆,加油!
1、二叉树先序遍历递归(recursion)算法
void preOrderRecursion(BiTree T)
{
if(T!=Null)
{
visit(*T);//调用visit()函数
preOrder(T->lchild);//先序遍历左子树
preOrder(T->rchild);//先序遍历右子树
}
}
2、二叉树先序遍历非递归算法(用栈实现)
void preOrderNoRecursion(BiTree T)
{
//定义一个栈s并初始化
initStack(s);
push(s,Null);
//p指针指向根节点
p=T;
while(p!=Null)
{
while(p!=Null)
{
visit(*p);
if(p->rchild!=Null)
push(s,p->rchild);//p的右孩子入栈
p=p->lchild;//p指向当前结点的左孩子
}
pop(s,p);
}
}
3、二叉树中序遍历递归算法
void inOrderRecursion(BiTree T)
{
if(T!=Null)
{
inOrder(T->lchild);
visit(*T);
inOrder(T->rchild);
}
}
4、二叉树中序遍历非递归算法
void inOrderNoRecursion(BiTree T)
{
//定义一个栈s并初始化
initStack(s);
push(s,Null);
//p指针指向根节点
p=T;
while(p!=Null)
{
push(s,p);
p=p->lchild;
}
pop(s,p);
while(p!=Null)
{
visit(*p);
p=p->rchild;
while(p!=Null)
{
push(s,p);
p=p->lchild;
}
pop(s,p);
}
}
5、二叉树层序遍历非递归算法
void levelOrder(BiTree T)
{
if(T!=Null)
{
initQueue(Q);
enQueue(Q,T);
while(!QueueEmpty(Q))
{
deQueue(Q,p);
visit(*p);
if(p->lchild!=Null)
enQueue(Q,p->lchild);
if(p->rchild!=Null)
enQueue(Q,p->rchild);
}
}
}
6、销毁一棵二叉树
void freeBiTree(BiTree p)
{
if(p!=Null)
{
freeBiTree(p->lchild);//清空左子树
freeBiTree(p->rchild);//清空右子树
free(p);//释放p指针,而不是根结点
}
}
//左右子树清空,还剩根结点处理
status destroyBiTree(BiTree &T)
{
freeBiTree(T);//调用左右子树清空函数,置空了T树的左右子树
T=Null;//根结点置空
return Ok;
}
7、求二叉树高度
//方式一
void depth(BiTree T,int level,int &d)
{
if(T!=Null)
{
if(level>d)
d=level;
depth(T->lchild,level+1,d);
depth(T->rchild,level+1,d);
}
}//调用前第3个实际参数赋0,调用时第2个实际参数赋1
//方式二
int depth(BiTree T)
{
if(T==Null)
return 0;
else
return 1+max(depth(T->lchild),depth(T->rchild));
}//高度=左右子树中最大层数+1(根结点)
8、判断两棵二叉树是否相似
status similar(BiTree B1,BiTree B2)
{
if(B1==Null&&B2==Null)
return TRUE;//B1,B2都空,相似
else if(B1==Null || B2==Null)
return FALSE;//一个空另一个不空,不相似
else
return similar(B1->lchild,B2->rchild)&&similar(B1->rchild,B2->rchild);
}//B1,B2左右子树相似
9、二叉树叶子结点的数量
int leaf(BiTree T)
{
if(T==Null)
return 0;//空树没有叶子
else if(T->lchild==Null&&T->rchild==Null)
return 1;//只有根结点,也就是一个叶子
else
return leaf(T->lchild)+leaf(T->rchild);//叶子数=左右子树叶子数量之和
}
10、删除二叉树中所有以根值是x的子树
void release(BiTree &T,TElemType x)
{
if(T!=Null)
{
//若根结点的值就是x,则删除整个二叉树
if(T->data==x)
{
freeBiTree(T);
T=Null;
}
else
{
release(T->lchild,x);
release(T->rchild,x);
}
}
}
11、二叉树每个结点增加一个DescNum域,用以存放该结点的子孙(descendent)数目
void descendent(BiTree T)
{
if(T!=Null)
{
T->DescNum=0;
if(T->lchild!=Null)
{
descendent(T->lchild);
T->DescNum += T->lchild->DescNum+1;
}
if(T->rchild!=Null)
{
descendent(T->rchild);
T->DescNum += T->rchild->DescNum+1;
}
}
}
12、前序遍历法和中序遍历法建立二叉链表
void create(TElemType preOrder[],int low1,int high1,TElemType inOrder[],int low2,int high2,BiTree &T)
{
if(low1>high1) T=Null;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=preOrder[low1];
i=low2;
while(inOrder[i]!=preOrder[low1])
i++;
create(preOrder,low1,low1-low2+i,inOrder,low2,i-1,T->lchild);
create(preOrder,low1-low2+i+1,high1,inOrder,i+1,high2,T->rchild);
}
}
13、按树状打印二叉链表存储的二叉树
void printBiT(BiTree T,int column)
{
if(T!=Null)
{
printBiT(T->rchild,column+1);
for(int i=1;i<column;i++)
{
printf(" ");//空格键
printf(T->data);
printf("\n");
printBiT(T->lchild,column+1);
}
}
}//调用时第2个实际参数为1
14、表达式(a-(b+c))*(d/e)以中序遍历法存储二叉树中,*符号为根结点,求值
int comp(BiTNode *p)
{
//A=(a-(b+c))作为左子树,B=(d/e)作为右子树
int A,B;
if(p!=Null)
{
if(p->lchild!=Null&&p->rchild!=Null)
{
A=comp(p->lchild);
B=comp(p->rchild);
return op(A,B,p->data);//采用后序遍历法,求出左右子树值,最后和根结点的值进行运算
}
else
return P->data-'0';//字符型转化为整数型
}
else
return 0;
}
15、各序列遍历法求第k个结点的值
//先序遍历
int n=0;//定义全局变量n,将结点计数初值记为0
void trave(BiTNode *p,int k)
{
if(p!=Null)
{
//①
++n;//当第1次来到1个结点时计数,表示第n个结点
if(k==n)//当第1次来到1个结点的时候进判断,看这个结点是否为先序序列中第k个结点
{
printf(p->data);
return;
}
//如果不是,继续左右子树找k结点
//②
trave(p->lchild,k);
//③
trave(p->rchild,k);
}
}
//中序遍历
int n=0;
void trave(BiTNode *p,int k)
{
if(p!=Null)
{
//②
trave(p->lchild,k);
//①
++n;
if(k==n)
{
printf(p->data);
return;
}
//③
trave(p->rchild,k);
}
}
//后序遍历
int n=0;
void trave(BiTNode *p,int k)
{
if(p!=Null)
{
//②
trave(p->lchild,k);
//③
trave(p->rchild,k);
//①
++n;
if(k==n)
{
printf(p->data);
return;
}
}
}