东北大学计算机初试历年二叉树算法题目及解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[1996] 设t 为一棵二叉树的根结点地址指针,试设计一个非递归算法完成把二叉树中每个结点的左右孩子位置交换。
int swithLRChild(BiTree *t)
{ BiTree *stack[100] = {0};
int stack_length = 0;
if (NULL == t){
return 0;
}
stack[stack_length++] = t;
while (stack_length > 0){
//pop stack
BiTree *node = stack[stack_length - 1];
stack_length -= 1;
BiTree *temp = node ->lchild;
node->lchild = node ->rchild; node->rchild = temp;
if (NULL != node ->rchild){ stack[stack_length++] = node ->rchild;}
if (NULL != node ->lchild){
stack[stack_length++] = node ->lchild;
}
}
return 1;
}
[1998]一棵高度为K 且有n个结点的二叉排序树,同时又是一棵完全二叉树存于向量t 中,试设计删除树中序号为i 且具有左右孩子的一个结点,而不使存储量增加保证仍为二叉排序树(不一定是完全二叉树)的算法。
//存数据的位置是从 1 的索引开始的,避免需要访问索引为0 的空间,避免需要频繁的索引
转换
void delNodeInSortedBiTree(int *sorted_bitree, int *last_index,int i)
{
//因为题目中描述具有左右孩子,所以直接从左孩子的最右边叶子节点开始//分两种情况,左孩子没有右孩子,那么左孩子之后的节点都移动一个位子//左孩子存在右孩子,则从右孩子的左孩子一直走,到叶子节点停止,因为是叶子节点//就不需要移动元素了
int del_node_index = 2*i;
if (2*del_node_index + 1 >= *last_index)
//左孩子只存在左子树
sorted_bitree[i] = sorted_bitree[del_node_index];
while (del_node_index*2 <= *last_index)
{
//后面的位置都往上移动
sorted_bitree[del_node_index] = sorted_bitree[2*del_node_index]; del_node_index *=
2;
}
sorted_bitree[del_node_index] = -1;
printf("last_index:%d\n", *last_index);
}
else
{
//移动到左孩子的右孩子
del_node_index = del_node_index*2 + 1;
while (2*del_node_index <= *last_index)
{
del_node_index *= 2;
}
//因为叶子节点,所以不需要移动
printf("r:%d rp:%d\n", sorted_bitree[i], sorted_bitree[del_node_index]); sorted_bitree[0] =
sorted_bitree[del_node_index]; sorted_bitree[del_node_index] = -1;
}
}
[2002] 对以二叉链表存储的非空二叉树,从右向左依次释放所有叶子结点,释放的同时,把结点值存放到一个向量中。
要求:( 1)用文字写出实现上述过程的基本思想. (2)写出算法*/
keyType XL[MAX];
Int iTmp=0;
void Ani_PreTravel(BiTree &T)
{
if(T)
{
if((T ->lchild == NULL) && (T ->rchild == NULL))
{
XL[iTmp++] == T ->data;
free(T);
T = NULL;
}
else
{
Ani_PreTravel(T ->rchild);
Ani_PreTravel(T ->lchild);
}
}
}
[2002] 设二叉排序树已经以二叉链表的形式存储在内存中,使用递归方法,求各结点的平衡
因子并输出。
要求:(1) 用文字写出实现上述过程的基本思想。
(2) 写出算法*/
(1)分别求出左子树与右子树的深度,二者之差即为该结点的平衡因子。
(2)
//递归求二叉树的深度
int Depth(_PNode pNode)
{
if (NULL != pNode)
{
int ld = Depth(pNode ->left);
int rd = Depth(pNode ->right);
return ld > rd ? ld + 1: rd + 1;
}
return 0;
}
//递归求二叉树每个结点的平衡因子
void Balance(_PNode pNode)
{
if (NULL != pNode)
{
Balance(pNode ->left);
Balance(pNode ->right);
int hl = Depth(pNode ->left);
int hr = Depth(pNode ->right);
pNode->bf = hl - hr;
print(pNode ->bf);// 输出各节点的平衡因子
}
}
[2003] 三、给出中序线索二叉树的结点结构,试编写在不使用栈和递归的情况下先序编历中序线索二叉树的算法。*/ 不懂!!!!!!!!!!!!!!
void InTraveseThr(BitTree thrt)
{
// 遍历中序线索二叉树
p = thrt ->lchild; //p 指二叉树根结点
while (p!=thrt)
{
while(p ->Ltag == 0)
p = p->lchild;
printf(p ->data);
while(p ->rtag == 1 && p ->rchild != thrt)