您的位置:首页 > 其它

判断一颗二叉树是否是搜索二叉树和完全二叉树

2018-12-17 22:00 211 查看
[code]package com.jsp.tree;

import java.util.LinkedList;

import java.util.Queue;
import java.util.Stack;

import com.jsp.tree.PreInPosTraversal.Node;

/**
* BST
* 判断 搜索二叉树
* @author jiangshipan
* 对任何一个节点 左子树都比它小, 右字数都比他们大
*
* 二叉树中序遍历 所有节点都是升序的都是搜索二叉树 (一般不出现重复节点)
*
* CBT
* 完全二叉树: 1. 若一个节点有右孩子 而没有左节点 返回false
* 			  2. 若一个节点 有左没右边,或两个都没有。则后面遇到的节点必须是叶子节点。
*/
public class IsBSTAndCBT {

public static class Node {
public int value;
public Node left;
public Node right;

public Node(int data) {
this.value = data;
}
}

public static boolean isBST(Node head) {
int value = 0;
//在中序遍历非递归 中修改
if (head != null) {
Stack<Node> stack = new Stack<Node>();
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
//value 存放当前弹出的值
value = head.value;
//peek获取当前栈顶的值 但不弹出
if (stack.peek().value < value) {
return false;
}
head = head.right;
}
}
}
return true;
}

public static boolean isCBT(Node head) {
if (head == null) {
return true;
}
//(双向链表)linkedlist可以实现队列
Queue<Node> queue = new LinkedList<Node>();
//表示是否开启叶子节点的判断
boolean leaf = false;
Node l = null;
Node r = null;
//向队列尾部插入数据
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
l = head.left;
r = head.right;
//leaf = false; 该节点不是叶子节点
if ((leaf && (l != null || r != null)) || (l == null && r != null)) {
return false;
}
if (l != null) {
queue.offer(l);
}
if (r != null) {
queue.offer(r);
}
if(l == null && r == null) {
// l == null 可以不写。前面已经判断过了 ???
//表明是叶子节点
leaf = true;
}

}
return true;
}

}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: