数据结构算法题思路

线性表

1,顺序表

删除操作:(3,4,5,6)

方法一:再编号法

方法二:前移k次法

方法三:尾插法(开始时只有第一个元素在顺序表中,慢慢尾插;重新构造新的线性表)例题:王道P18,题6

 

合并:(题7)

合并两个有序顺序表:1,按顺序不断取下两顺序表表头较小的节点存入新的顺序表。2,将剩下的部分加到新的顺序表的后面

 

位置变换:(题8)

可能的方法:逆置(reverse)如王道 题8,reverse方法使移动只需 o(m+n)次

 

记住折半查找失败的最终状态:王道P24

 

2,链表

链表删除操作:

两个指针:pre(当前指针的前驱指针),p(当前指针)

删除条件匹配时:pre不变,p=p->next;

删除条件不匹配时:pre=pre->next;p=p->next;

 

 

删除最小值:pre,p,minpre,minp

 

将单链表顺序逆置:1,头插法;2,指针逐个反转法(pre,p,r)

尾插法->顺序(保持原节点中的顺序)

 

单链表的排序:采用直接插入排序算法的思想,在原表之外建立一个只有一个节点的有序单链表。依次扫描,逐个插入。

在进行类似头插法的操作时,需要引入指针r,目的是保持*p后继结点指针,以保证不断链。

 

两个单链表有公共节点:即两个链表从某一结点开始,它们的next都指向同一个节点。由于每个单链表的next域只有一个,因此从第一个公共节点开始,之后他们所有的节点都是重合的。之可能出现Y字形的拓扑结构,不可能出现X形的拓扑结构。

当两个单链表有公共部分时,找公共节点的算法:1,计算两个单链表的长度。2,将长的单链表先遍历两个单链表长度之差个节点,然后同步移动两个指向两个单链表的指针,当第一次出现两个指针的值相等时,则找到了第一个公共节点,且此后所有节点都是公共节点。

 

头插法:首先将头节点的指针域置为NULL;head->next=NULL;

尾插法:先插入节点,在最后将尾节点的指针域置为NULL,rear-next=NULL;

 

建立头节点:LinkList a= (Linklist)malloc(sizeof(LNode);

创建新节点:Lnode *s=(LNode *)malloc(sizeof(LNode);

 

 

设置工作指针:p=L->next;

 

使用栈来判断链表的数据是否中心对称:让链表的前一半元素依次进栈。在处理链表后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若所有元素都相同,则中心对称。(要分奇偶讨论)

 

树:

对按顺序存储结构的二叉树,找两个节点的最近的公共祖先:序号小的等序号大的节点。

 

 

层序遍历求二叉树的高度

思路:

二叉树的高度等于层数,要求层数,只需找到每层最右节点的个数。

 

当队头指针=最右节点时,更新最右节点。因为此时队列中正好刚刚将下一层的所有结点都遍历了,此时的队尾结点就是要更新的最右节点。

循环结束条件同层序遍历结束条件,队空时跳出循环

 

 

此法还可以用来求某层的结点个数、每层的节点个数、树的最大宽度

求树的高度的递归算法:p135

 

 

实现用先序和后序遍历序列构造二叉树的二叉链表(用递归)

 

判断一棵二叉树是否未完全二叉树:

思路:用层序遍历,将包括空结点的所有节点加入队列,当访问到第一个空结点时,判断其后是否还有非空结点,如果有则不是完全二叉树;否则,是完全二叉树。

 

实现把用链式结构存储的二叉树的所有节点的左右子树互换。

思路:要互换所有结点的左右子树,那么先从最末端开始互换,即从叶子节点开始互换,当下层的呼唤完成上层只需互换本层的节点即可。这种从叶子节点开始遍历的思想同 后序遍历的思想相同。所以用后续遍历来完成。P127

 

 

删除以元素x为根的子树:(后序遍历(删除x的子树)+层序遍历(搜x结点))

思路:要删除以x为根的子树,同上题左右子树交换的思路,要使用后序遍历(要从叶子节点开始删除),要遍历整个树搜索data域为x的结点,这里使用层序遍历

 

 

 

 

题12(非递归后序遍历的应用)

 

 

找公共祖先结点:

两种情况:1,顺序存储的二叉树(p113,题5);2,链式存储的二叉树(p127,题13)

 

对情况1:序号小的等序号大的

 

对情况2:设两个节点指针为p,q;且设p在q的左边。

采用非递归后序遍历,当遍历到p指向的结点时,用一个辅助栈保存当前栈的信息。然后继续遍历,当遍历到q时,将此时的栈中的元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配的即为最近的公共祖先。

 

 

求以孩子兄弟链表为存储结构的树的深度

思路:递归;若树空,高度为零;否则,高度为第一子树高度+1和兄弟子树高度大者;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值