
数据结构和算法二十
循环搜索:从根节点开始,逐层向下移动。 返回值:循环结束后返回当前节点。 递推工作: 返回值:递归返回当前节点。 初始化:创建一个哈希表存储中序遍历的元素及其索引。 递归构建: 返回值:构建完成的根节点。
发布日期:2021-05-10 23:52:17
浏览次数:41
分类:精选文章
本文共 2135 字,大约阅读时间需要 7 分钟。
问题一:二叉搜索树的最近公共祖先
方法一:迭代法
- 如果当前节点的值小于p和q的值,说明p和q在右子树,移动到右子节点。
- 如果当前节点的值大于p和q的值,说明p和q在左子树,移动到左子节点。
- 如果当前节点的值介于p和q之间,则当前节点即为最近公共祖先,停止循环。
代码示例:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (p.val > q.val) { TreeNode tmp = p; p = q; q = tmp; } while (root != null) { if (root.val < p.val) { root = root.right; } else if (root.val > q.val) { root = root.left; } else { break; } } return root;}
方法二:递归法
- 如果p和q都在当前节点的右子树,递归到右子节点。
- 如果p和q都在当前节点的左子树,递归到左子节点。
- 否则,当前节点即为最近公共祖先。
代码示例:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (p.val > q.val) { TreeNode tmp = p; p = q; q = tmp; } return helper(root, p, q);}private TreeNode helper(TreeNode root, TreeNode p, TreeNode q) { if (root == null) { return null; } if (root.val < p.val) { return helper(root.right, p, q); } else if (root.val > q.val) { return helper(root.left, p, q); } else { return root; }}
问题二:重建二叉树
方法:分治法
- 根节点为前序遍历的第一个元素。
- 根节点在中序遍历中的索引划分左、右子树。
- 左右子树分别递归构建。
代码示例:
public TreeNode buildTree(int[] preorder, int[] inorder) { HashMapmap = new HashMap<>(); for (int i = 0; i < inorder.length; i++) { map.put(inorder[i], i); } return build(0, 0, inorder.length - 1);}private TreeNode build(int rootIndex, int left, int right) { if (left > right) { return null; } int currentVal = preorder[rootIndex]; int rootInOrderIndex = map.get(currentVal); TreeNode node = new TreeNode(currentVal); // 构建左子树 node.left = build(rootIndex + 1, left, rootInOrderIndex - 1); // 构建右子树 int rightStart = rootInOrderIndex + 1; int rightEnd = right; node.right = build(rootIndex + rightStart - left, rightStart, rightEnd); return node;}
总结
通过以上方法,可以高效地解决二叉搜索树的最近公共祖先问题和二叉树的重建问题。迭代法和递归法各有优劣,选择时需根据具体需求权衡。重建二叉树的分治法利用了前序和中序遍历的特性,确保了构建的准确性和效率。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月21日 12时47分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
参考图像
2019-03-09
设计模式(18)——中介者模式
2019-03-09
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
flink启动(二)
2019-03-09
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
Lua-table 一种更少访问的安全取值方式
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09