27.二叉搜索树与双向链表
递归:使用中序遍历,找到最左边的节点(即最小的节点,作为节点头)作为当前头节点,返回,上一节作为当前节点,当前节点指向头节点,头节点也指向当前节点,当前节点作为头节点;递归到右子树最大节点。
循环:使用中序遍历的非递归方法,在第二层循环外调整两个节点相互指向,最后返回第一个节点。
30.栈最小数min函数
引入辅助栈,第一个数入两栈,其余数比较辅助栈的栈顶元素大小,较小入辅助栈。因此辅助栈栈顶总是栈中最小元素。
31.栈的压入和弹出序列
思路1:弹出序列的第一个数字,确定之前需要压入的数字,即在压入队列中的第一个弹出的数字及之前的数字都需要被压入,然后根据弹出序列;根据出栈序列,元素在栈顶,则直接出栈,不在栈顶,压入再出栈,在栈中且不在栈顶,则不符合要求。
思路2:弹出序列第一个数字出现之前,压入栈连续入辅助栈,直到辅助栈顶等于第一个数字,辅助栈出栈,循环判断栈顶是否等于下一个弹出数,直到所有压入栈顶数字都压入辅助栈。辅助栈空,则符合,非空,则不符合。
32.从上到下打印二叉树
打印根节点,子树入队列,队列非空,出队打印,子树入队列,循环。
33.二叉搜索树大后续遍历序列
序列最后一个数字为根,比根小的为左树,比根大的为右树,如果右子树有小于根的,则返回false,递归判断子树。
34.二叉树路径
从上到下,压入节点值,符合要求,则加入结果中,不符合则返回,并删除当前节点。
35.复杂链表复制
先复制顺序链表。
思路1:用hashmao存储原节点和新节点,原节点random指向哪个,新节点的random也指向hashmap.get(原节点.random)