二叉树的遍历应用2

递归算法删除二叉树所有叶结点

若二叉树为空,返回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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值