《剑指offer》笔记-第4章(4)

来源:互联网 发布:筋长一寸寿延十年 知乎 编辑:程序博客网 时间:2024/05/22 15:03

面试题36:二叉搜索树与双向链表

       输入一棵二叉搜索树,将二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树中的节点指针指向。

测试用例:

         功能测试:完全二叉树、只有左/右子树、只有一个节点的二叉树

         特殊输入:二叉树根节点是null

分析:

       1.    二叉树中每个节点有两个指针分别指向左子节点和右子节点,双向链表中每个节点有两个指针分别指向其前、后节点;因此可以将二叉搜索树转换成双向链表;

       2.    对二叉搜索树的每个节点来说,前向指针指向的元素是其左子树的最大元素,后向指针指向的元素是其右子树的最小元素;

       3.    可用递归来解决问题;

       4.    要使双向链表要中序遍历;

       5.    左节点递归处理,中节点设置当前节点的左指针指向上一个遍历的节点,设置上一个节点的右指针指向该中节点;右节点递归处理;

       6.    转换完所有指针后,需要返回链表的头节点;

面试题37:序列化二叉树

       实现两个函数,分别用来序列化和反序列化二叉树;

       序列化时要记下null指针,如null指针可用‘$’表示;

       序列化:将一棵二叉树前序遍历输出一个序列,如1,2,4,$,$,$,3,5,$,$,6,$,$;

       反序列化:将一个序列变成一棵二叉树。

测试用例:

       功能测试:完全二叉树、只有左/右子树、只有一个节点的二叉树、节点值都相同;

       特殊输入:二叉树根节点是null

分析:

       1.    把二叉树分为3个部分,根节点、左子树、右子树;

       2.    处理完根节点后,在分别处理左子树(递归)、右子树(递归)

面试题38:字符串的排列

       输入一个字符串,打印出该字符串中字符的所有排列。例如,输入abc则打印出a、b、c的所有排列:abc、acb、bac、bca、cab、cba。

测试用例:

       功能测试:字符串有1个、多个字符;

       特殊输入:输入字符串内容为空、输入null

分析:

      1.    第一步求所有可能出现在第一个位置的字符;

      2.    第二步,固定第一个字符,求后面字符的排列;而后面的字符又可以分为第一个字符和后面的字符;

扩展

      不是求字符的排列,而是求字符的所有组合,例如a、b、c,所有的组合有:a、b、c、ab、ac、bc、abc。

分析:

      1.    求n个字符组成长度为m的组合:

      2.    将n个字符分成两部分,第一个字符和其余所有字符;

      3.    如果组合里包含第一个字符,则下一步在剩余n-1个字符里选取m-1个字符;

      4.    如果组合里不包含第一个字符,则下一步在剩余n-1个字符里选取m个字符;

4.5总结

        解决复杂问题的方法:画图、举例、分解;

       遇到链表、二叉树等数据结构时,画图可变得直观;

       遇到抽象的问题,举例子找到规律;

       大问题分解成若干小问题,递归地解决这些小问题;

       分治法、动态规划等思路都可以解决复杂问题;

 

原创粉丝点击