一、研讨题目:
1.后序后继线索二叉树中找结点p的后继(并不知道二叉树的根)。算法思想,对存储结构的要求,算法实现。
2.中序全线索二叉树中插入一课以结点x为根且只有左子树的中序全线索二叉树,作为结点p的左子树。若p原来有左子树,则其变为x的右子树。插入后保持全线索。算法思想,算法实现。
3.二叉链表表示的二叉树,复制二叉树的非递归算法。算法思想和算法实现。
二、内容整理:
1.后序后继线索二叉树中找结点p的后继(并不知道二叉树的根)。算法思想,对存储结构的要求,算法实现。
要点:
①第一位同学算法考虑了四种情况:
- 若结点p为根,则无后继,即结点P的后继为空;
- 若结点p为其双亲的右孩子,则其后继为其双亲结点;
- 若结点p为其双亲的左孩子,且双亲无右子女,则其后继为其双亲结点;
- 若结点p为其双亲的左孩子,且双亲有右子女,则结点p的后继是其双亲的右子树中按后序遍历的第一个结点,即该右子树中最左下的叶节点。
这种考虑有缺陷,没有考虑到右子树。
②第二位同学对其算法进行了补充完善,并讲解了相应的代码实现。考虑情况如下:
- 有右线索,直接得到
- 若结点*p为根,则无后继;
- 若结点*p为其双亲的右孩子,则其后继为其双亲;
- 若结点*p为其双亲的左孩子,且双亲无右子女,则其后继为其双亲;
- 若结点*p为其双亲的左孩子,且双亲有右子女,则结点*p的后继是其双亲的右子树中按后序遍历的第一个结点。
这样的考虑就很完善了,代码实现也很简洁。
2.中序全线索二叉树中插入一课以结点x为根且只有左子树的中序全线索二叉树,作为结点p的左子树。若p原来有左子树,则其变为x的右子树。插入后保持全线索。算法思想,算法实现。
要点:
①第一组同学将题目分为两种情况进行考虑:
- 如果p没有左子树,则把以x为根的子树直接作为p的左子树插入,并且插入后原来p的前驱结点成为以x为根的子树的中序序列第一个结点的前驱,p结点成为x的后继结点;
- 如果p原来有左子树,则把以x为根的子树直接作为p的左子树插入,令p原来的左子树作为x的右子树,并且p结点原来左子树中序序列第一个结点的前驱成为以x为根的子树的中序序列第一个结点的前驱,结点x成为p结点原来左子树中序序列第一个结点的前驱。
②最后某同学又上去补充总结,给了下面这张图,非常清晰直观的表明了题意以及算法实现中要进行新增与修改的线索,让人的理解更加明了。
3.二叉链表表示的二叉树,复制二叉树的非递归算法。算法思想和算法实现。
要点:
①第一位同学使用层序遍历和队列的方法实现。
②第二位同学讲解了用栈实现的方法。该算法与先序遍历的非递归算法类似,在其基础上进行了修改。首先是在算法中使用两个栈,一个用于保存当前树中遍历的结点,另一个用于保存复制得到的书中的结点。另外还需将先序遍历中访问结点改为复制产生新树的结点。
--------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------
拖了这么久。
复制完毕。
收。
课程学习的研讨报告。
扔在文件夹里说不定什么时候就丢掉了吧。
虽然有些弱渣,
但是感觉还算有些价值就贴出来好了。
毕竟前几篇里面,
好多也是当时我辛辛苦苦弄懂然后整理出来的。
代码可以敲起来了。
嗯。