剑指ⅡOffer68
题目描述:
解题思路:
情况1:当root等于p或者q,直接可以返回root
情况2:当root的左右两边都存在p或q之一,则返回root
情况3:当root的左右都没有p或q之一,则返回false
情况4:如果root的左边找到p或者q之一,右边没有,则返回左边
情况5:如果root的右边找到p或者q之一,左边没有,则返回右边
代码:
递归的查找p,q
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null){
return null;
}
if(root==q || root==p){
return root;
}
TreeNode left=lowestCommonAncestor(root.left, p, q);
TreeNode right=lowestCommonAncestor(root.right, p, q);
if(right!=null && left!=null){
return root;
}
if(left!=null ){
return left;
}
if(left==null){
return right;
}
return null;
}
}
剑指 Offer 36
题目描述:
解题思路:
最后需要变为一个有序的双向循环链表,刚好是一颗搜索树,所有只需要中序遍历即可得到有序的序列。left指前驱节点,right指后继节点。所有在递归的中序遍历过程中,修改当前节点pCur的指向即可。定义一个preNode来记录pCur的前驱节点。所有每一次的层序遍历中,添加如下代码:
pCur.left=preNode;
if(preNode!=null){
preNode.right=pCur;
}
preNode=pCur;
如果是pCur是头节点,那么此时调用preNode会报空指针异常,所有添加if判断。
代码:
class Solution {
public Node preNode=null;
public void toList(Node pCur){
if(pCur==null){
return;
}
toList(pCur.left);
pCur.left=preNode;
if(preNode!=null){
preNode.right=pCur;
}
preNode=pCur;
toList(pCur.right);
}
public Node treeToDoublyList(Node root) {
if(root==null){
return null;
}
toList(root);
Node head=root;
while(head.left!=null){
head=head.left;
}
Node end=root;
while(end.right!=null){
end=end.right;
}
head.left=end;
end.right=head;
return head;
}
}
LeetCode606:
题目描述:
代码:
class Solution {
public String tree2str(TreeNode root) {
StringBuilder sb=new StringBuilder();
if(root ==null){
return sb.toString();
}
child(root,sb);
return sb.toString();
}
public void child(TreeNode t,StringBuilder sb) {
if (t==null){
return ;
}
sb.append(t.val);
if(t.left!=null){
sb.append("(");
child(t.left,sb);
sb.append(")");
}else{
if(t.right==null){
return;
}else{
sb.append("()");
}
}
if(t.right==null){
return;
}else{
sb.append("(");
child(t.right,sb);
sb.append(")");
}
}
}