二叉树扩展
判断两个二叉树是否相同
leetcode:相同的树
public boolean isSameTree(TreeNode p, TreeNode q) {
boolean flg = true;
if (p == null && q == null) {
return flg;
}else if (p == null||q == null){
return false;
}
if (p.val != q.val){
return false;
}
flg = isSameTree(p.left,q.left);
if (flg == false){
return flg;
}
flg = isSameTree(p.right,q.right);
if (flg == false){
return flg;
}
return flg;
}
判断后树是不是前树的子树
leetcode:另一颗树的子树
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root == null && subRoot == null){
return true;
}else if(root == null || subRoot == null){
return false;
}
if (isSameTree(root,subRoot)) {
return true;
}else {
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
}
return false;
}
public boolean isSameTree(TreeNode p, TreeNode q) {
boolean flg = true;
if (p == null && q == null) {
return flg;
}else if (p == null||q == null){
return false;
}
if (p.val != q.val){
return false;
}
flg = isSameTree(p.left,q.left);
if (flg == false){
return flg;
}
flg = isSameTree(p.right,q.right);
if (flg == false){
return flg;
}
return flg;
}
平衡二叉树
子树都为平衡二叉树且根节点所在的树也为平衡二叉树的二叉树叫做平衡二叉树。也就是平衡二叉树的所有子树都为平衡二叉树
左右高度的差的绝对值不大于1的二叉树就叫做平衡二叉树
leetcode:平衡二叉树
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
if (Math.abs(maxDepth(root.left)-maxDepth(root.right))>1) return false;
if ( ! isBalanced(root.left)){
return false;
}
if(!isBalanced(root.right)) {
return false;
}
return true;
}
public int maxDepth(TreeNode root) {
if(root == null) return 0;
int leftHight = maxDepth(root.left);
int rightHight = maxDepth(root.right);
return leftHight > rightHight ? leftHight+1:rightHight+1;
}
对称二叉树
检查一个二叉树是否与它的镜像二叉树一样
leetcode:对称二叉树
public boolean is(TreeNode root1,TreeNode root2) {
if(root1 == null && root2 == null) return true;
if(root1 == null || root2 == null) return false;
if(root1.val == root2.val) {
if(!is(root1.left,root2.right)) return false;
if(!is(root1.right,root2.left)) return false;
return true;
}
return false;
}
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
if(is(root.left,root.right)){
return true;
}
return false;
}
二叉树的层序遍历
leetcode:层序遍历
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
Queue<TreeNode> que = new LinkedList<>();
if (root == null) return ret;
que.offer(root);
for (;!que.isEmpty(); ) {
int size = que.size();
List<Integer> tmp = new ArrayList<>();
for (;size!=0;) {
TreeNode cur = que.poll();
tmp.add(cur.val);
if (cur.left!=null) {
que.offer(cur.left);
}
if (cur.right!=null) {
que.offer(cur.right);
}
size--;
}
ret.add(tmp);
}
return ret;
}
判断此二叉树是否为完全二叉树
leetcode:完全性检验
public boolean isCompleteTree(TreeNode root) {
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while (!que.isEmpty()) {
TreeNode cur = que.poll();
if (cur ==null){
break;
}else {
que.offer(cur.left);
que.offer(cur.right);
}
}
while (!que.isEmpty()) {
if (que.poll() != null) return false;
}
return true;
}