二叉搜索树的中序遍历是有序的;
完全二叉树:一棵深度为k的有n个结点的 二叉树 ,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与 满二叉树 中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
如何判断二叉搜索树:对二叉树进行中序遍历,如果前后两节点的值都满足:前一个节点的值小于后一个节点的值,那么该二叉树是二叉搜索树
如何判断完全二叉树:对二叉树进行层序遍历
- 一个节点如果存在右子节点,但是不存在左子节点,那么该二叉树必然不是完全二叉树
- 当确定叶子节点后,如果后序节点存在左子节点或者存在右子节点,那么该二叉树必然不是完全二叉树。那么怎么确定叶子节点已经存在:如果一个节点不存在左子节点或者不存在右子节点,那么后序节点必然都是叶子节点。
NC60 判断一棵二叉树是否为搜索二叉树和完全二叉树
给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树和完全二叉树。
输出描述:分别输出是否为搜索二叉树、完全二叉树。
数据范围:二叉树节点数满足0≤n≤500000 ,二叉树上的值满足0≤val≤100000
要求:空间复杂度O(n),时间复杂度O(n)
注意:空子树我们认为同时符合搜索二叉树和完全二叉树。
通过以上分析,Java代码如下:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类 the root
* @return bool布尔型一维数组
*/
int pre = -1;
boolean flag = true;
public boolean[] judgeIt (TreeNode root) {
// write code here
if(root == null) {
return new boolean[]{true,true};
}
boolean[] res = new boolean[2];
dfs(root);
res[0] = flag;
res[1] = bfs(root);
return res;
}
public void dfs(TreeNode root) {
if(root.left != null) {
dfs(root.left);
}
if(pre == -1) {
pre = root.val;
} else {
if(pre > root.val) {
flag = false;
}
pre = root.val;
}
if(root.right != null) {
dfs(root.right);
}
}
public boolean bfs(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
boolean leaf = false;
while(q.size() > 0) {
int size = q.size();
for(int i = 0;i < size;i++) {
TreeNode node = q.poll();
if(node.left == null && node.right != null) {
return false;
}
if(leaf && (node.left != null || node.right != null)) {
return false;
}
if(node.left != null) {
q.offer(node.left);
}
if(node.right != null) {
q.offer(node.right);
} else {
leaf = true;
}
}
}
return true;
}
}