package jz.bm;
import jz.TreeNode;
import java.util.*;
public class bm3 {
public int[] preorderTraversal (TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
preOrder(root, list);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private void preOrder(TreeNode root, ArrayList<Integer> list) {
if (root != null) {
list.add(root.val);
preOrder(root.left, list);
preOrder(root.right, list);
}
}
public int[] inorderTraversal (TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
inOrder(root, list);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private void inOrder(TreeNode root, ArrayList<Integer> list) {
if (root != null) {
inOrder(root.left, list);
list.add(root.val);
inOrder(root.right, list);
}
}
public int[] postorderTraversal (TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
postOrder(root, list);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private void postOrder(TreeNode root, ArrayList<Integer> list) {
if (root != null) {
postOrder(root.left, list);
postOrder(root.right, list);
list.add(root.val);
}
}
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int n = queue.size();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode cur = queue.poll();
list.add(cur.val);
if (cur.left != null) {
queue.add(cur.left);
}
if (cur.right != null) {
queue.add(cur.right);
}
}
res.add(list);
}
return res;
}
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (pRoot == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
boolean flag = false;
while (!queue.isEmpty()) {
int n = queue.size();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode cur = queue.poll();
list.add(cur.val);
if (cur.left != null) {
queue.add(cur.left);
}
if (cur.right != null) {
queue.add(cur.right);
}
}
if (flag) {
Collections.reverse(list);
}
flag = !flag;
res.add(list);
}
return res;
}
int max = 0;
public int maxDepth (TreeNode root) {
dfs28(root, 0);
return max;
}
private void dfs28(TreeNode root, int depth) {
if (root != null) {
depth += 1;
max = Math.max(max, depth);
dfs28(root.left, depth);
dfs28(root.right, depth);
}
}
boolean hasPath = false;
public boolean hasPathSum (TreeNode root, int sum) {
dfs29(root, sum);
return hasPath;
}
private void dfs29(TreeNode root, int cur) {
if (root != null) {
cur -= root.val;
if (root.left == null && root.right == null && cur == 0) {
hasPath = true;
return;
}
dfs29(root.left, cur);
dfs29(root.right, cur);
}
}
TreeNode head;
TreeNode pre;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree != null) {
Convert(pRootOfTree.left);
if (pre == null) {
head = pRootOfTree;
} else {
pre.right = pRootOfTree;
pRootOfTree.left = pre;
}
pre = pRootOfTree;
Convert(pRootOfTree.right);
}
return head;
}
public boolean isSymmetrical (TreeNode pRoot) {
if (pRoot != null) {
return mirror(pRoot.left, pRoot.right);
} else {
return true;
}
}
private boolean mirror(TreeNode left, TreeNode right) {
if (left == null && right == null) {
return true;
}
if (right == null || left == null || left.val != right.val) {
return false;
}
return mirror(left.left, right.right) && mirror(left.right, right.left);
}
public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
if (t1 == null) {
return t2;
}
if (t2 == null) {
return t1;
}
t1.val = t1.val + t2.val;
t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
return t1;
}
boolean res34 = true;
TreeNode pre34 = null;
public boolean isValidBST (TreeNode root) {
inOrder(root);
return res34;
}
private void inOrder(TreeNode root) {
if (root != null) {
inOrder(root.left);
if (pre34 == null) {
pre34 = root;
} else {
if (root.val <= pre34.val) {
res34 = false;
}
}
pre34 = root;
inOrder(root.right);
}
}
public boolean isCompleteTree (TreeNode root) {
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
boolean hasNull = false;
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur == null) {
hasNull = true;
} else {
if (hasNull) {
return false;
}
queue.add(cur.left);
queue.add(cur.right);
}
}
return true;
}
public boolean IsBalanced_Solution (TreeNode pRoot) {
if (pRoot == null) {
return true;
}
return IsBalanced_Solution(pRoot.left) && IsBalanced_Solution(pRoot.right) && Math.abs(dfs36(pRoot.left) - dfs36(pRoot.right)) <= 1;
}
private int dfs36(TreeNode pRoot) {
if (pRoot != null) {
return Math.max(dfs36(pRoot.left), dfs36(pRoot.right)) + 1;
}
return 0;
}
public int lowestCommonAncestor (TreeNode root, int p, int q) {
if (root == null) {
return -1;
}
if ((p <= root.val && root.val <= q) || (q <= root.val && root.val <= p)) {
return root.val;
} else if (p <= root.val && q <= root.val) {
return lowestCommonAncestor(root.left, p, q);
} else {
return lowestCommonAncestor(root.right, p, q);
}
}
public int lowestCommonAncestor1 (TreeNode root, int o1, int o2) {
if (root == null) {
return -1;
}
if (o1 == root.val || o2 == root.val) {
return root.val;
}
int left = lowestCommonAncestor1(root.left, o1, o2);
int right = lowestCommonAncestor1(root.right, o1, o2);
if (left == -1) {
return right;
}
if (right == -1) {
return left;
}
return root.val;
}
public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
if (preOrder.length == 0 || vinOrder.length == 0) {
return null;
}
TreeNode head = new TreeNode(preOrder[0]);
int index = getIndex(preOrder[0],vinOrder);
head.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, index + 1), Arrays.copyOfRange(vinOrder, 0, index));
head.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, index + 1, preOrder.length), Arrays.copyOfRange(vinOrder, index + 1, vinOrder.length));
return head;
}
private int getIndex(int head, int[] vinOrder) {
for (int i = 0; i < vinOrder.length; i++) {
if (head == vinOrder[i]) {
return i;
}
}
return -1;
}
public int[] solve (int[] preOrder, int[] inOrder) {
TreeNode head = reConstructBinaryTree(preOrder, inOrder);
if (head == null) {
return new int[0];
}
ArrayList<Integer> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(head);
while (!queue.isEmpty()) {
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode cur = queue.poll();
if (i == n - 1) {
list.add(cur.val);
}
if (cur.left != null) {
queue.add(cur.left);
}
if (cur.right != null) {
queue.add(cur.right);
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}