LeetCode 102. 二叉树的层序遍历
题目链接:102. 二叉树的层序遍历
思路:使用队列来进行遍历。首先根结点先入队列。此时队列中已经有元素了。当队列为空即为循环的终止条件。定义一个变量size用于每次循环记录二叉树每一层结点的个数,用于控制内层循环的次数,从而达到每次输出一层的元素。目前根结点在队列中。size=1,让队列队首元素加入数组,然后让指针指针该元素对应的树中结点(这就要求队列中存的是结点而不是结点的中的数据)。让该元素出队。此时size--,刚刚指针指向了对应树中的结点。然后让该结点的左孩子入队,再右孩子入队,size--此时内层循环结束。然后再继续处理其左右孩子即可。
具体实现:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList();
List<List<Integer>> res1 = new ArrayList();
Deque<TreeNode> deque = new LinkedList();
if(root==null){
return res1;
}
deque.add(root);
while (!deque.isEmpty()){
int size = deque.size();
List<Integer> list = new ArrayList<>();
while (size>0){
TreeNode node = deque.peek();
list.add(node.val);
deque.poll();
size--;
if(node.left!=null){
deque.add(node.left);
}
if(node.right!=null){
deque.add(node.right);
}
}
res.add(list);
}
return res;
}
}
图解:
LeetCode 226. 翻转二叉树
题目链接:226. 翻转二叉树
思路:二叉树的题目其实大多都可以往递归方面想。其实从他给出的示例可以看出,要对二叉树进行翻转,就要对其中从根结点开始的每一个结点的左右孩子进行交换。这就涉及到递归了。想到这其实就很好操作了。
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){
return null;
}
//交换逻辑
TreeNode p=null;
p=root.left;
root.left = root.right;
root.right = p;
//递归操作
//即对每一个结点都要对齐左右孩子进行交换
invertTree(root.left);
invertTree(root.right);
return root;
}
}
LeetCode 101. 对称二叉树
题目链接:101. 对称二叉树
思路:这道题和上一道题有点类似,但个人感觉这道要难一点。其实如果弄不清递归的化,我们就举一个常态的二叉树来进行模拟。就比如他给出的示例这一道。如何判断一棵树是对称呢?从根结点开始。要判断其左右孩子的值是否相等。如果相等要继续判断的化,就是要判断其左孩子的左孩子和右孩子的右孩子是否相等,还要再判断左孩子的右孩子和右孩子的左孩子是否相等。以这个逻辑递归下去。就能针对每一个结点判断它的孩子结点是否对称。这样就写好了.
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public boolean compare(TreeNode left, TreeNode right){
if(left!=null &&right==null){
return false;
} else if (left==null &&right!=null) {
return false;
} else if (left==null&&right==null) {
return true;
}else if (left.val!=right.val){
return false;
}
boolean a=compare(left.left,right.right);
boolean b=compare(left.right,right.left);
return a&&b;
}
}