判断是否是搜索二叉树
2017-08-22 14:59
369 查看
判断一棵二叉树是否为搜索二叉树和完全二叉树
【题目】
给定一个二叉树的头节点head,已知其中没有重复值的节点,实现两个函数分别判断这棵二叉树是否是搜索二叉树和完全二叉树。
解题思路:
搜索二叉树的中序遍历是递增的,所以我们利用Morris进行中序遍历,判断是否递增即可,只要中间有不是递增,就不是搜索二叉树
判断是否是二叉树,从完全二叉树的性质入手1、若节点有右孩子无左孩子,则不是
2、在1的前提下,若该节点的孩子节点不全(即没有右孩子或左右孩子都没有),那么接下来的所有节点,均 是叶子节点
JAVA程序:
ipackage problems_2017_08_21;
import java.util.LinkedList;
import java.util.Queue;
public class Problem_03_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) {
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;
}
public static boolean isCBT(Node head) {
if (head == null) {
return true;
}
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;
if ((leaf && (l != null || r != null)) || (l == null && r != null)) {
return false;
}
if (l != null) {
queue.offer(l);
}
if (r != null) {
queue.offer(r);
} else {
leaf = true;
}
}
return true;
}
// for test -- print tree
public static void printTree(Node head) {
System.out.println("Binary Tree:");
printInOrder(head, 0, "H", 17);
System.out.println();
}
public static void printInOrder(Node head, int height, String to, int len) {
if (head == null) {
return;
}
printInOrder(head.right, height + 1, "v", len);
String val = to + head.value + to;
int lenM = val.length();
int lenL = (len - lenM) / 2;
int lenR = len - lenM - lenL;
val = getSpace(lenL) + val + getSpace(lenR);
System.out.println(getSpace(height * len) + val);
printInOrder(head.left, height + 1, "^", len);
}
public static String getSpace(int num) {
String space = " ";
StringBuffer buf = new StringBuffer("");
for (int i = 0; i < num; i++) {
buf.append(space);
}
return buf.toString();
}
public static void main(String[] args) {
Node head = new Node(4);
head.left = new Node(2);
head.right = new Node(6);
head.left.left = new Node(1);
head.left.right = new Node(3);
head.right.left = new Node(5);
printTree(head);
System.out.println(isBST(head));
System.out.println(isCBT(head));
}
}
C++程序:
#include<iostream>
#include<queue>
#include<stdlib.h>
using namespace std;
struct node{
int val;
node *left;
node *right;
node():val(0),left(NULL),right(NULL){}
};
bool isBST(node *head)
{
if(head==NULL)
return true;
<
4000
br />node *curr=head;
node *p=NULL;
node *pre=NULL;
while(curr!=NULL)
{
p=curr->left;
if(p!=NULL)
{
while(p->right!=NULL&&p->right!=curr)
p=p->right;
if(p->right==NULL)
{
p->right=curr;
curr=curr->left;
continue;
}
if(p->right==curr)
{
p->right=NULL;
}
}
if(pre!=NULL&&pre->val>curr->val)
return false;
pre=curr;
curr=curr->right;
}
return true;
}
bool isCBT(node *head)
{
if(head==NULL)
return true;
bool leaf=false;
queue<node*> que;
que.push(head);
while(!que.empty())
{
node *temp=que.front();
que.pop();
if((temp->left==NULL&&temp->right!=NULL)||(leaf&&(temp->left!=NULL||temp->right!=NULL)))
return false;
if(temp->left!=NULL)
que.push(temp->left);
if(temp->right!=NULL)
que.push(temp->right);
else
leaf=true;
}
return true;
}
int main()
{
node *head=new node();
head->val=5;
head->left=new node();
head->left->val=3;
head->right=new node();
head->right->val=7;
head->left->left=new node();
head->left->left->val=1;
head->left->right=new node();
head->left->right->val=4;
/*head->right->left=new node();
head->right->left->val=6;*/
head->right->right=new node();
head->right->right->val=8;
cout<<isBST(head)<<endl;
cout<<endl;
cout<<isCBT(head)<<endl;
system("pause");
return 0;
}
【题目】
给定一个二叉树的头节点head,已知其中没有重复值的节点,实现两个函数分别判断这棵二叉树是否是搜索二叉树和完全二叉树。
解题思路:
搜索二叉树的中序遍历是递增的,所以我们利用Morris进行中序遍历,判断是否递增即可,只要中间有不是递增,就不是搜索二叉树
判断是否是二叉树,从完全二叉树的性质入手1、若节点有右孩子无左孩子,则不是
2、在1的前提下,若该节点的孩子节点不全(即没有右孩子或左右孩子都没有),那么接下来的所有节点,均 是叶子节点
JAVA程序:
ipackage problems_2017_08_21;
import java.util.LinkedList;
import java.util.Queue;
public class Problem_03_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) {
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;
}
public static boolean isCBT(Node head) {
if (head == null) {
return true;
}
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;
if ((leaf && (l != null || r != null)) || (l == null && r != null)) {
return false;
}
if (l != null) {
queue.offer(l);
}
if (r != null) {
queue.offer(r);
} else {
leaf = true;
}
}
return true;
}
// for test -- print tree
public static void printTree(Node head) {
System.out.println("Binary Tree:");
printInOrder(head, 0, "H", 17);
System.out.println();
}
public static void printInOrder(Node head, int height, String to, int len) {
if (head == null) {
return;
}
printInOrder(head.right, height + 1, "v", len);
String val = to + head.value + to;
int lenM = val.length();
int lenL = (len - lenM) / 2;
int lenR = len - lenM - lenL;
val = getSpace(lenL) + val + getSpace(lenR);
System.out.println(getSpace(height * len) + val);
printInOrder(head.left, height + 1, "^", len);
}
public static String getSpace(int num) {
String space = " ";
StringBuffer buf = new StringBuffer("");
for (int i = 0; i < num; i++) {
buf.append(space);
}
return buf.toString();
}
public static void main(String[] args) {
Node head = new Node(4);
head.left = new Node(2);
head.right = new Node(6);
head.left.left = new Node(1);
head.left.right = new Node(3);
head.right.left = new Node(5);
printTree(head);
System.out.println(isBST(head));
System.out.println(isCBT(head));
}
}
C++程序:
#include<iostream>
#include<queue>
#include<stdlib.h>
using namespace std;
struct node{
int val;
node *left;
node *right;
node():val(0),left(NULL),right(NULL){}
};
bool isBST(node *head)
{
if(head==NULL)
return true;
<
4000
br />node *curr=head;
node *p=NULL;
node *pre=NULL;
while(curr!=NULL)
{
p=curr->left;
if(p!=NULL)
{
while(p->right!=NULL&&p->right!=curr)
p=p->right;
if(p->right==NULL)
{
p->right=curr;
curr=curr->left;
continue;
}
if(p->right==curr)
{
p->right=NULL;
}
}
if(pre!=NULL&&pre->val>curr->val)
return false;
pre=curr;
curr=curr->right;
}
return true;
}
bool isCBT(node *head)
{
if(head==NULL)
return true;
bool leaf=false;
queue<node*> que;
que.push(head);
while(!que.empty())
{
node *temp=que.front();
que.pop();
if((temp->left==NULL&&temp->right!=NULL)||(leaf&&(temp->left!=NULL||temp->right!=NULL)))
return false;
if(temp->left!=NULL)
que.push(temp->left);
if(temp->right!=NULL)
que.push(temp->right);
else
leaf=true;
}
return true;
}
int main()
{
node *head=new node();
head->val=5;
head->left=new node();
head->left->val=3;
head->right=new node();
head->right->val=7;
head->left->left=new node();
head->left->left->val=1;
head->left->right=new node();
head->left->right->val=4;
/*head->right->left=new node();
head->right->left->val=6;*/
head->right->right=new node();
head->right->right->val=8;
cout<<isBST(head)<<endl;
cout<<endl;
cout<<isCBT(head)<<endl;
system("pause");
return 0;
}
相关文章推荐
- [互联网面试笔试汇总C/C++-15] 判断一棵二叉树是否是完全搜索树-微策略
- Java 判断一个序列是否是搜索二叉树的后序遍历结果
- 剑指offer24判断某一序列是否是某一搜索二叉树的后续遍历结果
- 判断二叉树是否是搜索二叉树和完全二叉树
- 算法-判断是否为搜索二叉树
- 【BST】判断一棵二叉树是否是搜索二叉树
- 判断一棵二叉树是否为搜索二叉树、完全二叉树、平衡二叉树(java)
- 剑指offer 判断数组的后序遍历是否为搜索二叉树
- 判断一棵二叉树,是否是搜索二叉树
- 二叉树问题---判断数组是否为某搜索二叉树的后序遍历的结果
- 判断数组是否是搜索二叉树的后序遍历
- 二叉树问题---判断一棵树是否为搜索二叉树
- 判断数组是否为搜索二叉树的后序遍历
- 二叉树经典面试题4~判断一棵树是否是完全二叉树
- 二叉树层次遍历的应用--判断一颗二叉树是否为规则二叉树
- 判断二叉树是否为轴对称二叉树
- 【剑指offer】判断二叉树是否平衡(左右子树高度差最多为1)
- 剑指off-判断一棵二叉树是否包含另一棵
- 数据结构-判断链式二叉树是否相同
- 剑指offer 6.3 知识迁移能力3- 判断二叉树是否是平衡二叉树