/**
* 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;
* }
* }
*/
//这个写法是对的,依据BFS分层每层都是一个集合的写法(上一个题解)。
//暂且认为满二叉树的时候可以这么写吧,就是没null的时候。
// class Solution {
// public boolean isSymmetric(TreeNode root) {
// if (root == null) return true;
// LinkedList<TreeNode> queue = new LinkedList<>();
// TreeNode t = new TreeNode(-1);
// boolean flag = false;
// queue.offer(root);
// while (!queue.isEmpty()) {
// int n = queue.size();
// List<Integer> re = new ArrayList<>();
// for (int i = 0; i < n; i++) {
// TreeNode node = queue.poll();
// re.add(node.val);
// //注意为null的情况
// if (node.left != null) {
// queue.offer(node.left);
// } else {
// queue.offer(t);
// }
// if (node.right != null) {
// queue.offer(node.right);
// } else {
// queue.offer(t);
// }
// }
// //集合中的对称元素
// for (int i = 0; i < n/2; i++) {
// if (re.get(i) == re.get(n - i -1)) {
// //来一次判断一次,打个标记就行
// flag = true;
// } else {
// flag = false;
// }
// }
// }
// return flag;
// }
// }
//递归或者迭代,在找一个树用来做对称
//很重要的一点,就是null的时候是怎么回事。
//应该是null也算一个TreeNode了,也入队列了,弹出来也是null,
//但是不能在继续指left或者right,不然就是空指针异常了
class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode u, TreeNode v) {
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(u);
queue.offer(v);
while (!queue.isEmpty()) {
u = queue.poll();
v = queue.poll();
if (u == null && v == null) {
continue;
}
if ((u == null || v == null) || (u.val != v.val)) {
return false;
}
queue.offer(u.left);
queue.offer(v.right);
queue.offer(u.right);
queue.offer(v.left);
}
return true;
}
}
/**
* 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;
* }
* }
*/
//这么写真是2b(这写法也是错误的)
// class Solution {
// public int countNodes(TreeNode root) {
// if (root == null) return 0;
// Queue<TreeNode> queue = new LinkedList<>();
// queue.offer(root);
// int ceng = 0;
// while (!queue.isEmpty()) {
// ceng++;
// int n = queue.size();
// for (int i = 0; i < n; i++) {
// TreeNode node = queue.poll();
// if (root.left != null) {
// queue.offer(root.left);
// }
// if (root.right != null) {
// queue.offer(root.right);
// }
// }
// }
// int res = (int)Math.pow(2, ceng);
// return res;
// }
// }
//这是对的,就是特殊的时候,最后一行不满的时候怎么操作,记住都是这样的,设置一个条件跳出去
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int res = 0;
int size = 1;
while (!queue.isEmpty()) {
int n = queue.size();
res += n;
if (n != size) break;
for (int i = 0; i < n; i++) {
TreeNode temp = queue.poll();
if (temp.left != null) queue.offer(temp.left);
if (temp.right != null) queue.offer(temp.right);
}
//size = size << 1;
size <<= 1;
}
return res;
}
}
//二分查找 + 位运算(这个好像只适合值也是连续呀)
class Solution {
public int countNodes(TreeNode root) {
if (root == null) {
return 0;
}
int level = 0;
TreeNode node = root;
while (node.left != null) {
level++;
node = node.left;
}
int low = 1 << level, high = (1 << (level + 1)) - 1;
while (low < high) {
int mid = (high - low + 1) / 2 + low;
if (exists(root, level, mid)) {
low = mid;
} else {
high = mid - 1;
}
}
return low;
}
public boolean exists(TreeNode root, int level, int k) {
int bits = 1 << (level - 1);
TreeNode node = root;
while (node != null && bits > 0) {
if ((bits & k) == 0) {
node = node.left;
} else {
node = node.right;
}
bits >>= 1;
}
return node != null;
}
}
/**
* 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 isBalanced(TreeNode root) {
if (root == null) {
return true;
} else {
return Math.abs(height(root.left) - height(root.right)) <= 1
&& isBalanced(root.left)
&& isBalanced(root.right);
}
}
public int height(TreeNode root) {
if (root == null) {
return 0;
} else {
return Math.max(height(root.left), height(root.right)) + 1;
}
}
}
/**
* 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<String> binaryTreePaths(TreeNode root) {
List<String> paths = new ArrayList<String>();
constructPaths(root, "", paths);
return paths;
}
public void constructPaths(TreeNode root, String path, List<String> paths) {
if (root != null) {
StringBuffer pathSB = new StringBuffer(path);
pathSB.append(Integer.toString(root.val));
if (root.left == null && root.right == null) { // 当前节点是叶子节点
paths.add(pathSB.toString()); // 把路径加入到答案中
} else {
pathSB.append("->"); // 当前节点不是叶子节点,继续递归遍历
constructPaths(root.left, pathSB.toString(), paths);
constructPaths(root.right, pathSB.toString(), paths);
}
}
}
}
/**
* 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 int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int sum = 0;
while (!queue.isEmpty()) {
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
if (node.left.left == null && node.left.right == null) sum += node.left.val;
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return sum;
}
}
/**
* 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 int findBottomLeftValue(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
TreeNode node = root;
while (!queue.isEmpty()) {
//这边还得注意变量问题,最后用到了poll出来的节点
//TreeNode node = queue.poll();
node = queue.poll();
if (node.right != null) queue.offer(node.right);
if (node.left != null) queue.offer(node.left);
}
return node.val;
}
}
/**
* 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;
* }
* }
*/
//用2个队列的还理解的不是很好
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) {
return false;
}
Queue<TreeNode> queNode = new LinkedList<TreeNode>();
Queue<Integer> queVal = new LinkedList<Integer>();
queNode.offer(root);
queVal.offer(root.val);
while (!queNode.isEmpty()) {
TreeNode now = queNode.poll();
int temp = queVal.poll();
if (now.left == null && now.right == null) {
if (temp == sum) {
return true;
}
continue;
}
if (now.left != null) {
queNode.offer(now.left);
queVal.offer(now.left.val + temp);
}
if (now.right != null) {
queNode.offer(now.right);
queVal.offer(now.right.val + temp);
}
}
return 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 List<List<Integer>> pathSum(TreeNode root, int targetSum) {
//利用map找到父节点递归得到需要的整个集合
Map<TreeNode, TreeNode> map = new HashMap<>();
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> queNode = new LinkedList<TreeNode>();
Queue<Integer> queVal = new LinkedList<Integer>();
queNode.offer(root);
queVal.offer(root.val);
while (!queNode.isEmpty()) {
TreeNode now = queNode.poll();
int temp = queVal.poll();
if (now.left == null && now.right == null) {
if (temp == targetSum) {
res.add(getPath(now, map));
}
continue;
}
if (now.left != null) {
queNode.offer(now.left);
queVal.offer(now.left.val + temp);
map.put(now.left, now);
}
if (now.right != null) {
queNode.offer(now.right);
queVal.offer(now.right.val + temp);
map.put(now.right, now);
}
}
return res;
}
public static List<Integer> getPath(TreeNode node, Map<TreeNode, TreeNode> map) {
List<Integer> res = new ArrayList<>();
while (node != null) {
res.add(node.val);
node = map.get(node);
}
Collections.reverse(res);
return res;
}
}