《剑指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总结
解决复杂问题的方法:画图、举例、分解;
遇到链表、二叉树等数据结构时,画图可变得直观;
遇到抽象的问题,举例子找到规律;
大问题分解成若干小问题,递归地解决这些小问题;
分治法、动态规划等思路都可以解决复杂问题;
- 《剑指offer》笔记-第4章(4)
- 《剑指offer》笔记-第4章(1)
- 《剑指offer》笔记-第4章(2)
- 《剑指offer》笔记-第4章(3)
- 《剑指offer》笔记-第5章(4)
- 《剑指offer》笔记-第2章(3)
- 《剑指offer》笔记-第3章(1)
- 《剑指offer》笔记-第5章(1)
- 《剑指offer》笔记-第5章(2)
- 《剑指offer》笔记-第5章(3)
- 《剑指offer》笔记-第5章(5)
- 《剑指offer》笔记-第6章(1)
- 《剑指offer》阅读笔记-第1章
- 《剑指offer》笔记-第三章(4)
- 剑指offer刷题笔记(4)
- [剑指Offer] 第4章课后题详解
- 重建二叉树 (剑指Offer 第 4 题)
- 剑指offer第4题 空格替换
- 会话技术
- MyBatis注解
- NYOJ 833 取石子(七)
- 2017最佳经典之作-AngularJs 中select 下拉多选
- A
- 《剑指offer》笔记-第4章(4)
- idea 配置Tomcat
- 关于卸载赛风(psiphon)打不开网页解决办法
- 【分享】一些经典的C/C++语言基础算法及代码(一)
- 【分享】一些经典的C/C++语言基础算法及代码(二)
- 【分享】一些经典的C/C++语言基础算法及代码(三)
- 【分享】一些经典的C/C++语言基础算法及代码(四)
- 关键字@property与@synthesize梳理
- Python构建代理池