二叉树习题整理(二)

题目一

编写递归算法,求二叉树中以元素值为x的结点为根的子树的深度

思想

先递归找出x的位置,用p指向,然后找到子树的深度(求树的深度的思路:
1、如果树为空,则深度为0
2、如果树不是空,那么深度是左子树的深度+1或右子树的深度+1)

代码

int T644(BiTree *T,TElemType x)
{
	BiTree p;
	p=locationBiTree(T,x);	//第一个递归找出x的位置,用p指向
	return BiTreedepth(p);	//返回p的深度
}
BiTree locationBiTree(BiTree *T,TElemType x){
	if(T){
		if(T->data==x){
			return T;
		}
		else{
			locationBiTree(T->lchild,x);
			locationBiTree(T->rchild,x);
		}
	}
	return NULL;
}
int BiTreedepth(BiTree p){
	int n1,n2;
	if(p==NULL)
		return 0;
	else{
		n1=BiTreedepth(p->lchild);
		n2=BiTreedepth(p->rchild);
		if(n1>n2)
			return n1+1;
		else
			return n2+1;
	}
}

题目二

对于二叉树中每一个元素值为x的结点,删除以它为跟的子树,并释放相应的空间

思路

代码

void T645(BiTree *T,ElemType x)
{
	if(*T)
	{
		if((*T)->data=x)
			ClearBiTree(T);
		else
		{
			T645(&(*T)->lchild,x);
			T645(&(*T)->rchild,x);
		}
	}
}	

题目三

层次顺序遍历二叉树

思想

首先根结点入队,然后循环,有左节点则左节点入队,有右节点则右节点入队;j标识队列,i标识循环次数

代码

void T647(BiTree T)
{
	int i,j;
	BiTree p[100];			//数组模拟队列
	i=j=0;
	if(T)
	 	p[j++]=T;			//根结点入队
	 while(i<j)
	 {
	 	printf("%c",p[i]->data);
	 	if(p[i]->lchild)
	 		p[j++]=p[i]->lchild;		//左节点入队
	 	if(p[i]->rchild)
	 		p[j++]=p[i]->rchild;		//右节点入队
	 		i++;
	 }
}
发布了73 篇原创文章 · 获赞 20 · 访问量 4472

猜你喜欢

转载自blog.csdn.net/lzl980111/article/details/103038605