递归算法删除二叉树所有叶结点
若二叉树为空,返回NULL;
若二叉树只有一个结点,直接删除;
否则递归左右子树。
void Del(BiTNode *&t)
{
if(t==NULL) return;
if(t->lcild==NULL&&t->rchild==NULL)
{
delete t;
t=NULL;
}
else
{
Del(t->lchild);
Del(t->rchild);
}
}
递归算法求二叉树各结点元素最大值
设max是预先设定的最大值,初始值为0,判断是否有比其更大的值并修改。
void MaxValue(BiTNode *t,DataType &max)
{
if(t!=NULL)
{
if(t->data>max)
{
max=t->data;
}
MaxValue(t->lchild,max);
MaxValue(t->rchild,max);
}
}
由于递归语句中,由函数参数表返回最大值,故max为引用型参数。
递归算法交换二叉树的左右子女
先对左子树和右子树进行递归调换,最后交换根的左右子女
void exchange(BiTNode *t)
{
if(t==NULL) return;
exchange(t->lchild);
exchange(t->rchild);
BiTNode *p;
p=t->lchild;
t->lchild=t->rchild;
t->child=p;
}
由前序序列和中序序列构造二叉树
设前序序列pre[s1,…,t2],中序序列in[s2,…,t2],初始时s1=s2=0,t1=t2=n;以pre[s1]建立根节点,搜索in[s1]=pre[s1]的位置i,把中序序列分为in[s2,…i-1]和in[i+1,…t2]两个子序列,再递归构造左右子树。
void createBiTree(BiTNode *t,DataType pre[], DataType in[], int s1,int s2,int t1,int t2)
{//pre存放前序序列,in存放中序序列
int i;
t = (BiTNode*)malloc(sizeof(BiTNode));
t->data = pre[s1]; //前序序列的第一个元素一定是根节点
for(i=s2; i<t2; i++)
{
if(in[i]==pre[s1])
break;
}
//使用递归,分别插入左子树和右子树
createBiTree(t->lchild,pre,in,s1+1,s1+i-s2,s2,i-1);
createBiTree(t->rchild,pre,in,s1+i-s2+1,t1,i+1,t2);
}
由后序序列和中序序列构造二叉树
与由前序序列和中序序列构造二叉树类似,不过根结点为post[t1],即后序序列的最后一位
void createBiTree(BiTNode *t,DataType post[], DataType in[], int s1,int s2,int t1,int t2)
{
int i;
t = (BiTNode*)malloc(sizeof(BiTNode));
t->data = post[t1]; //后序序列的最后一个元素一定是根节点
for(i=s2; i<t2; i++)
{
if(in[i]==post[t1])
break;
}
//使用递归,分别插入左子树和右子树
createBiTree(t->lchild,pre,in,s1+i-s2,t1-1,i+1,t2);
createBiTree(t->rchild,pre,in,s1,s1+i-s2-1,s2,i-1);
}
用前序遍历求前序遍历的第k个结点
加入计数器count,在访问的同时记录结点序号
BiTNode* Pre_Find_k(BiTNode t,int &count,int k)
{
if(t!==NULL)
{
count++;
if(count==k) return t;
BiTNode *p;
p=(BiTNode*)malloc(sizeof(BiTNode));
if((p=Pre_Find_k(t->lchild,count,k))!=NULL) return p;
else return (Pre_Find_k(t->rchild,count,k));
}
else return NULL;
}