六、给定两个二叉树的结点node1和node2,找到他们的最低公共祖先节点
题解:即两个节点往上最先汇聚的点
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
HashMap<TreeNode,TreeNode> fatherNode = new HashMap<>();
fatherNode.put(root,root);
HashSet<TreeNode> set1 = new HashSet<>();
//其中p所有父节点存入set1中
TreeNode cur1 = p;
while(cur1 != fatherNode.get(cur1)){
set1.add(cur1);
cur1 = fatherNode.get(cur1);
}
//头结点必然是父节点,也放入set1中
set1.add(root);
//判断q与p的首个祖先节点
TreeNode cur2 = q;
while(cur2 != fatherNode.get(cur2)){
if(set1.contains(cur2.val)){
return cur2;
}
cur2 = fatherNode.get(cur2);
}
return root;
}
//完成整棵树可以向上走的功能
public void process(TreeNode root, HashMap<TreeNode,TreeNode> fatherNode){
fatherNode.put(root.left,root);
fatherNode.put(root.right,root);
process(root.left,fatherNode);
process(root.right,fatherNode);
}
}
如果头结点不是o1或o2或null,则o1和o2的位置只有两种情况。
1)o1是o2的LCA,或 o1是o2的LCA
2)o1和o2不互为最低公共祖先
七、后继结点
中序遍历中,一个结点的下一个结点。
题解:从结构上证明,每次找只要花距离等长的时间复杂度O(k),而不是从头到尾遍历一遍。
图 2:01:33到最后没看
链表后半段没看,二叉树前半段没看