二叉樹経典練習問題(基礎)--JAVA
20386 ワード
import java.util.LinkedList;
import java.util.Queue;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x ;
}
static TreeNode build() {
// build ,
TreeNode A = new TreeNode('A');
TreeNode B = new TreeNode('B');
TreeNode C = new TreeNode('C');
TreeNode D = new TreeNode('D');
TreeNode E = new TreeNode('E');
TreeNode F = new TreeNode('F');
TreeNode G = new TreeNode('G');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
E.left = G;
C.right = F;
return A;
}
boolean isCompleteTree(TreeNode root) {
// :
//1. :
//
// ,
// ,
if(root == null) {
return true;
}
boolean isFirstStep = true;
//
Queue<TreeNode> queue = new LinkedList<>();
queue.offer((TreeNode) root);
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
}
return isFirstStep;
}
public boolean isSameTree(TreeNode s, TreeNode t) {
//
if(s == null && t == null) {
return true;
}
if(s == null ||t == null){
return false;
}
return s.val == t.val && isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
}
public boolean isSubtree(TreeNode s, TreeNode t) {
// s t, s t 。
// s s 。
// s
if(s == null) {
return false;
}
// s : s t
return isSameTree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
}
public int maxDepth(TreeNode root) {
// ,
//
//ps:
// = 1 + max( , )
if(root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
}
public boolean isBalanced(TreeNode root) {
// , .
// :
// 1.
if(root == null) {
return true;
}
if(root.left == null && root.right == null) {
return true;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return (left - right <= 1 && left - right >= -1) && isBalanced(root.left) && isBalanced(root.right);
}
private boolean isMirrow(TreeNode t1, TreeNode t2) {
// :
// , ( )
//
//&& .left .right
//&& .right .left
if(t1 == null && t2 == null) {
return true;
}
if(t1 == null || t2 == null) {
return false;
}
return (t1.val == t2.val) && isMirrow(t1.left, t2.right) && isMirrow(t1.right, t2.left);
}
public boolean isSymmetric(TreeNode root) {
// ,
if(root == null) {
return true;
}
return isMirrow(root.left, root.right);
}
}