下面开始第一题:
输入一颗二元查找树,将该二叉查找树转换成一个排序的双向链表。要求不能创建任何新的节点,只调整指针的方向:
1:二叉查找树的定义我在这里不多解释,无非是递归左<中<右:
2:一般解决链表类的问题的时候可以辅助的申明头节点指针和尾节点指针来辅助思考或者解答,和初中解三角形的中位线一样是万金油
首先是节点类型:在这里我没有附带数据域;
bin_search_tree_node
{
bin_search_tree_node *left_c , *right_c;
};
然后是大的函数框架:返回的是一个双向链表,回忆一下,链表类型只要知道头指针就可以了,树类型只要知道根节点就可以了;
bin_search_tree_node * treeToDList(bin_search_tree_node *root);
3:和第二条一样,遇到链表想到辅助的头指针,遇到树就想到递归: 当然所有叶子节点的left_c == NULL right_c == NULL;
4:下面是这个题目解题思路和手稿:
对于叶子节点肯定是递归的出口:递归函数的设计注意如果在return 也就是出口改变的“参数”,返回值就会改变调用该层的“参数”
这个解释很绕口,心得,具体怎么样问老师吧(或者参考我的附件里面的代码):
这个题目我还是设置了2个全局变量和 2个局部变量:递归模型是这个样子的:
void fun(bin_search_tree *root)
{
if(.....) { ............; break; } 这里是递归 的出口
fun(root->left_c);
fun(root->right_c); //最后发现这个模型不是很好写代码,加上头尾节点指针,则不用设置两全局变量,而是4个局部变量;
if(...) { 00000000) ; 修改指针指向; 晚上上传附件 ;
}