前言
“这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战”
- NC16 判断二叉树是否对称(简单)
- NC60 判断一棵二叉树是否为搜索二叉树和完全二叉树(中等)
判断二叉树是否对称
描述:给定一棵二叉树,判断其是否是自身的镜像(即:是否对称) 思路分析: DFS 定义递归函数 isEq 判断两颗树是否对称
- 如果都为 null 返回true
- 其次判断是否有一颗树是空的, 如果是 返回 false
- 比较两颗树根节点的值是否相等
- 递归比较 左树的左子树 跟 右树的右子树 && 左树的右子树 跟 右树的左子树
AC 代码:
public boolean isSymmetric (TreeNode root) {
// write code here
if(root == null){
return true;
}
return isEq(root.left, root.right);
}
boolean isEq(TreeNode l, TreeNode r){
if(l == null && r == null) return true;
if(l == null || r == null) return false;
if(l.val != r.val) return false;
return isEq(l.left,r.right) && isEq(l.right,r.left);
}
判断一棵二叉树是否为搜索二叉树和完全二叉树(
描述:给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树和完全二叉树。
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树
完全二叉树:一棵深度为k的有n个结点的,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
思路分析: 判断二叉搜索树:
- 中序遍历 将val 保存到 list 集合中 ,判断是否升序排列
- DFS 实现
判断完全二叉树: 按照定义, 给每个节点编号,最后判断 最后一个节点的编号是否为节点的数量
AC 代码:
public boolean[] judgeIt (TreeNode root) {
// write code here
boolean isBfs = isBFS(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
boolean isFull = isFull(root);
return new boolean[]{isBfs, isFull};
}
boolean isBFS(TreeNode root, int minVal, int maxVal){
if(root == null){
return true;
}
if(root.val <= minVal || root.val >= maxVal){
return false;
}
return isBFS(root.left, minVal, root.val) &&
isBFS(root.right, root.val, maxVal);
}
boolean isFull(TreeNode root){
List<Node> list = new ArrayList<>();
list.add(new Node(root, 1));
int i = 0;
while(i < list.size()){
Node cur = list.get(i);
if(cur.node != null){
list.add(new Node(cur.node.left, cur.no * 2));
list.add(new Node(cur.node.right, cur.no * 2 + 1));
}
i++;
}
int size = list.size();
Node last = list.get(size - 1);
return last.no == size;
}
class Node{
TreeNode node;
int no;
public Node(TreeNode node, int no){
this.node = node;
this.no = no;
}
}