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

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 stack = new Stack();
			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 queue = new LinkedList();
		//表示是否开启叶子节点的判断
		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;
	}
	
	
	
}

 

你可能感兴趣的:(java)