日升时奋斗,日落时自省
目录
一、二叉树练习
习题六
条件解析:
(1)题中给的是List的嵌套,List集合接口实例化创建
(2)首先判空
(3)队列解决问题,将一层一层队入(图解)
(4)入队一层后,定义一个临时变量cur,出队找左子树和右子树
(5)队列不空,依次重复操作(循环)
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list=new ArrayList<>(); //需要的嵌套List
if(root==null){ //首先是判空
return list;
}
Queue<TreeNode> qu=new LinkedList<>(); //创建一个队列
qu.offer(root); //整个树的根节点
while(!qu.isEmpty()){ //循环,队列不为空
int size= qu.size();; //计算每层的个数
List<Integer> tmp=new ArrayList<>(); //创建一个List,存放嵌套值
while(size>0){ //每层的循环
TreeNode cur=qu.poll(); //一个临时变量来接受队列的队头,同时接收左子树和右子树
tmp.add(cur.val); //每层循环都将当前根节点放入List
if(cur.left!=null){ //左树不为空存放
qu.offer(cur.left);
}
if(cur.right!=null){ //右树不为空存放
qu.offer(cur.right);
}
size--; //循环结束条件别忘
}
list.add(tmp); //外层嵌套录入
}
return list;
}
图解:
习题七
236. 二叉树的最近公共祖先 - 力扣(LeetCode)
条件解释:
(1)最近的公共祖先,就是两个节点的在该最小子树的根节点
(2)判断空树
(3)找两个节点的位置,判断是否找到其中一个
(4)遍历
(5)遍历后两个都找到了,返回
(6)遍历后找到左子树其中一个,返回当前节点,在右子树找
(7)遍历后找到右子树中的一个,返回当前节点
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null){ //判空
return null;
}
if(q==root||p==root){ //找到的情况下就是找到其中一个
return root; //返回当前值
}
TreeNode leftside=lowestCommonAncestor(root.left,p,q); //左子树遍历
TreeNode rightside=lowestCommonAncestor(root.right,p,q); //右子树遍历
if(leftside!=null&&rightside!=null){ //如果两个都找到了就自然返回当根节点
return root;
}else if(leftside!=null){ //找到某个节点以后返回到当前根节点
return leftside;
}else if(rightside!=null){ //作用与上面相同
return rightside;
}else {
return null; //没有找到的情况下返空
}
}
图解:
三种情况
习题八
二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)
条件解释:
(1)首先就是想到中序遍历解决问题(就题论题)
(2)成为双向链表之前需要一个节点来往回连接
(3)每递归回去一次就连接一次
public TreeNode Convert(TreeNode pRootOfTree) { //中序遍历转链表
if(pRootOfTree==null){
return null;
}
CovertChildren(pRootOfTree);
TreeNode head=pRootOfTree;
while(head.left!=null){ //从根节点到最左边,返回出链表头
head=head.left;
}
return head;
}
public void CovertChildren(TreeNode root){ //模仿中序遍历
if(root==null){
return ;
}
CovertChildren(root.left);
root.left=prev; //像来双向链表一样衔接
if(pre!=null){
prev=root;
}
prev=root;
CovertChildren(root.right);
}
图解:(蓝色为递归回退)