非线性结构习题

二叉树

  • 6.12 已知 L[i] 和 R[i] (i = 1 , 2 , … , n)分别指示二叉树中第 i 个结点的左孩子和右孩子结点,0表示空,试写判别 结点u 是否是 结点v 的子孙的算法。
    ------------------------------------- 分析 -------------------------------------
    u 是否是 v 的子孙 --> 从 结点v 出发遍历能够到达 结点u
    判断是否是子孙 ---> 遍历算法
    给定的存储结构实质上是一个 二叉链表
    ------------------------------------- 分析 -------------------------------------
Status descendent(int L[], int R[], int u,int v)// u/v 为 0 表示结点不存在
{
	if(u && v)//u 和 v 都是合法存在的
	{
		if(L[v]==u || R[v]==u)
		{
			return TRUE;
		}
		else if(descendent(L, R, u, L[v]))
		{
			return TRUE;
		}
		else
		{
			return descendent(L, R, u, R[v]);
		}
	}
	else
	{
		return FALSE;
	}
}
  • 6.19 编写递归算法:对于二叉树中每一个元素值为 x 的结点,删去以它为根的子树,并释放相应的空间。
    ------------------------------------- 分析 -------------------------------------
    先序遍历二叉树的过程中查找每一个元素值为 x 的结点
    找到的话修改 值为x的结点的双亲结点 的相应指针
    释放 以 值为x的结点 的子树上的所有结点,按后序 来释放。
    ------------------------------------- 分析 -------------------------------------
void Delete_X(BiTree &BT, ElemType x)
{
	if(BT)//空树啥都不用做
	{
		if(BT->data == x)
		{
			disp(BT);// 整棵树删除掉,释放以它为根的树
			BT = NULL;// 修改指针
		}
		else
		{
			Delete_X(BT->Lchild, x);
			Delete_X(BT->Rchild, x);
		}
	}
}
  • 6.22 编写一个算法,输出以二叉树表示的算术表达式,若该表达式中含有括号,则在输出时应该添上。
    ------------------------------------- 分析 -------------------------------------
    原表达式即为带括弧的中缀表达式,则该题应该进行中序遍历;
    表达式求值应该进行后序遍历(先求左子树的值,在求右子树的值,最后以这两个操作数为基础求最终结果)
    输出表达式使用 中序遍历
    ------------------------------------- 分析 -------------------------------------
void Expression(BiTree T)
{
	if(T)
	{
		// 根结点运算符优先级 大于 左子树根结点的优先级
		// 若根结点是 数字 的话,视为优先级无穷大
		if(precede(T->data, T->Lchild->data))
		{
			printf("(");
			Expression(T->Lchild);
			printf(")");
		}
		else
		{
			EXpression(T->Lchild);
		}
		//  打印根结点
		printf(T->data);
		// 根结点运算符优先级 大于 右子树根结点的优先级
		if(precede(T->data, T->Rchild->data))
		{
			printf("(");
			Expression(T->Rchild);
			printf(")");
		}
		else
		{
			EXpression(T->Rchild);
		}
	}
}

  • 6.24 编写算法完成下列操作:无重复地输出以孩子兄弟链表存储的树 T 中所有的边,输出的形式为 (k1 , k2) , … , (ki , kj) , … , 其中 ki 和 kj 为树结点中的结点标识。
typedef struct CSNode
{
	ElemType data;
	struct CSNode *firstChild, *nextSibling;
} CSNode, *CSTree;

void printEdge(CSTree T)
{
	if(T)
	{
		p = T->firstchild;
		while(p)
		{
			printf(T->data, p->data);
			printEdge(p);
			p = p->nextsibling; // p指向当前层次的下一个子树结点
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值