1,搜索二叉树
定义:当前节点大于左子树节点和小于右子树节点的二叉树是搜索二叉树。
优势就是,查找的时间复杂度是log(n)
根据二叉搜索树的性质,它的中序遍历,得到的值应该是有序的。
2.代码实现判断二叉树是否是搜索二叉树
中序遍历实现
public class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
//中序遍历
public static void inTraversal(Node head,List<Integer> list) {
if(head == null) {
return;
}
inTraversal(head.left, list);
list.add(head.value);
inTraversal(head.right, list);
}
//判断是否是搜索二叉树
public boolean isBST(Node head) {
List<Integer> list = new ArrayList<Integer>();
inTraversal(head, list);
for(int i = 1 ; i < list.size() ; i++) {
if(list.get(i - 1) > list.get(i)) {
return false;
}
}
return true;
}
非中序遍历实现
public boolean isBST(Node head){
if(head==null){
return true;
}
boolean res = true;
Node pre = null;
Node cur1 = head;
Node cur2 = null;
while(cur1 != null){
cur2 = cur1.left;
if(cur2 != null){
while(cur2.right != null && cur2.right != cur1){
cur2 = cur2.right;
}
if(cur2.right == null){
cur2.right = cur1;
cur1 = cur1.left;
continue;
}else {
cur2.right = null;
}
}
if(pre != null && pre.value > cur1.value){
res = false;
}
pre = cur1;
cur1 = cur1.right;
}
return res;
}
思想:是找到当前cur1节点的前继节点,如果前继节点的右孩子为空设置为当前cur1节点,如果不为空设置为null。