判断搜索二叉树和完全二叉树
题目描述
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
示例1
输入 {2,1,3}
返回值 [true,true]
回顾:
- 搜索二叉树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 - 完全二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
package 牛客.树;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class 判断搜索二叉树和完全二叉树 {
public boolean[] judgeIt (BTreeNode<Integer> root) {
boolean[] result = {true,true};
if(root == null)
return result;
Stack<BTreeNode<Integer>> stack = new Stack<>();
ArrayList<Integer> list = new ArrayList<>();
BTreeNode<Integer> cur = root;
while(!stack.isEmpty()){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else {
cur = stack.pop();
list.add(cur.data);
cur = cur.right;
}
}
for (int i = 1; i < list.size(); i++) {
if(list.get(i) < list.get(i - 1)){
result[0] = false;
break;
}
}
Queue<BTreeNode<Integer>> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
BTreeNode<Integer> node = queue.peek();
if(node.left != null && node.right != null){
queue.poll();
queue.add(node.left);
queue.add((node.right));
}
if(node.left == null && node.right != null) {
result[1] = false;
break;
}
if((node.left != null && node.right == null)
|| (node.left == null && node.right == null)){
if(node.left != null && node.right == null)
queue.add(node.left);
queue.poll();
while (!queue.isEmpty()){
node = queue.peek();
if(node.left == null && node.right == null)
queue.poll();
else {
result[1] = false;
break;
}
}
}
}
return result;
}
public static void main(String[] args) {
判断搜索二叉树和完全二叉树 obj = new 判断搜索二叉树和完全二叉树();
BTree<Integer> tree = new BTree<>();
for (int i = 0; i < 10; i++) {
tree.RandomCreatTree(tree.root, i);
}
final boolean[] booleans = obj.judgeIt(tree.root);
System.out.println(booleans[0] + " " + booleans[1]);
}
}