lintcode刷题总结 --二叉树和基于树的DFS

二叉树的考察形态

求值求路径类问题

480. 二叉树的所有路径
可分别使用分治法或者遍历法完成

结构变换类问题

453. 将二叉树拆成链表
有多种解法:
1.非递归,用栈记录顺序
2.分治思想,把左右子树各转换成链表的形式,再合并(将右子树接到子树底端,再将左子树移到根节点的右边,左节点设为空)。结束条件为空节点返回空,函数返回为该树的最后一个节点。
3.遍历,用深度优先,先序遍历所有节点,需设立一个全局变量记录上一个节点,并将当前访问节点设为上一个节点的右子树,再依次访问当前节点的左右子树。

二叉查找树类问题

95.验证二叉查找树
有两种方式:
1.若中序遍历得到的数组是升序的,则为二叉查找树,否则不是。
2.用分治法的思想,需要让左子树的最大值小于根节点,右子树的最小值大于根节点。
这里值得注意的是使用了一个ResultType类来作为返回值。可以在我们定义的函数需要返回多个值供调用者计算时使用该方法。

902.BST中第k小的元素
要找到BST中第 K 小的元素,首先想到的是对其进行中序遍历后得到的升序序列取第k个值。
优化版本(针对BST经常被修改的情况):使用一个HashMap记录每个子树的节点数目,再找第k小的元素就方便了。

86.二叉查找树迭代器
该 Iterator 算法即 non-recursion 的 inorder traversal,不仅仅适用于 BST,任何 Binary Tree 都可以
• stack 中保存一路走到当前节点的所有节点
• stack.peek() 一直指向 iterator 指向的当前节点
• hasNext() 只需要判断 stack 是否为空
• next() 只需要返回 stack.peek() 的值,并将 iterator 挪到下一个点,对 stack 进行相应的变化
挪到下一个点的算法如下:
• 如果当前点存在右子树,那么就是右子树中“一路向西”最左边的那个点
• 如果当前点不存在右子树,则是走到当前点的路径中,第一个左拐的点

900.二叉搜索树中最接近的值
首先可以想到使用中序遍历计算所有差值,最小的即是结果,但复杂度为O(n)。
其次是求出 lowerBound 和 upperBound。即 < target 的最大值和 >= target 的最小值。
然后在两者之中去比较谁更接近,然后返回即可。复杂度为O(h),h是树的高度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值