二叉树层序遍历
文章链接
二叉树的层序遍历需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
题目链接
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> reslist = new LinkedList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
cheakfun(root);
return reslist;
}
public void cheakfun(TreeNode root) {
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();//利用队列遍历二叉树的每一层
queue.add(root);
while (!queue.isEmpty()) {
ArrayList<Integer> integers = new ArrayList<>();//integers 存储每一层的数据
int size = queue.size();//控制每层poll的次数正好是该层元素的元素
while (size > 0) {
TreeNode node = queue.peek();
queue.poll();
integers.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
size--;
}
reslist.add(integers);
}
}
}
翻转二叉树
题目链接:
思路:
本题可以采用递归遍历,对左右孩子进行交换,最后实现二叉翻转
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return root;
}
swap(root);// 交换左右节点
invertTree(root.left);//翻转左子树
invertTree(root.right);//翻转右子树
return root;
}
public void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
对称二叉树
题目链接:
思路:
如何判断二叉树是否对称
要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)
- 左节点为空,右节点不为空,不对称,return false
- 左不为空,右为空,不对称 return false
- 左右都为空,对称,返回true
此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:
- 左右都不为空,比较节点数值,不相同就return false
- 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
- 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
- 如果左右都对称就返回true ,有一侧不对称就返回false 。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
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 cheak_1=compare(left.left,right.right);
//比较左孩子的右节点和有孩子的左节点是否对称
boolean cheak_2=compare(left.right,right.left);
//返回结果
return cheak_1&&cheak_2;
}
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
return compare(root.left,root.right);
}
}