二叉树
- 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)
{
if(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;
}
}
}