1. 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
思路:
(后序遍历,递归) O(n)
后序遍历,数组的最后一个值是二叉树的根节点,所以前面的值一部分小于根节点,一部分大于根节点,因为是二叉搜索树,找到比根节点小的,则为左子树,比根节点大的为右子树,然后递归整个数组即可。
2. 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
样例
给出二叉树如下所示,并给出num=22。
5
/ \
4 6
/ / \
12 13 6
/ \ / \
9 1 5 1
输出:[[5,4,12,1],[5,6,6,5]]
思路:
采用递归遍历,sum减减,直到sum=0且此时没有左右子树的时候得到的路径即为答案,此时将此路径加入结果列表
注:Java中集合list的add方法添加的是地址(引用)不是值,然后path会改变,会影响最后的ans,所以复制一份
3. 复杂链表的复刻
请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
注意:
- 函数结束后原链表要与输入时保持一致。
思路:
用hashmap将每个节点先进行copy,然后用原节点做key,复制节点做value存进hashmap
然后遍历链表,把复制节点取出连好即可,因为hashmap的增删改查是O(n)。所以时间复杂度为O(n)。
4.二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
- 需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。
思路:
在中序递归遍历的基础上修改,用一个pre指针保存中序遍历的前一个结点;
因为是中序遍历,遍历顺序就是双线链表的建立顺序;
每一个结点访问时它的左子树肯定被访问过了,所以放心大胆的改它的left指针,不怕树断掉;
同理,pre指向的结点保存的数肯定小于当前结点,所以其左右子树肯定都访问过了,所以其right指针也可以直接改