您的位置:首页 > 其它

找到二叉树中的最大搜索二叉子树

2017-11-17 10:57 645 查看


//找到二叉树中的最大搜索二叉子树
public class MaxSearchTree{

//二叉树节点的定义
public static class Node{

public int value;

public Node left;

public Node right;

public Node(int data)
{

this.value=data;
}

}

//利用后序遍历的方式查找最大的搜索二叉子树
public static Node maxSearchTree(Node head)
{
int[]record=new int[3];// 0->size, 1->min, 2->max

return posOrder(head,record);

}

//利用后序遍历(记录头结点、节点数、最小值和最大值)
public static Node posOrder(Node head,int[]record)
{
if(head==null)
{
record[0]=0;  //节点数
record[1]=Integer.MAX_VALUE;//最大值
record[2]=Integer.MIN_VALUE;//最大值

return null;

}
//记录头结点的值
int value=head.value;
Node left=head.left;
Node right=head.right;

//左子树
Node lBST=posOrder(left,record); //递归调用
int  lSize=record[0]; //节点数
int  lMin =record[1]; //最小值
int  lMax=record[2];  //最大值

//右子树
Node rBST=posOrder(right,record);//递归调用
int  rSize=record[0];
int  rMin =record[1];
int  rMax=record[2];

record[1]=Math.min(lMin,value);
record[2]=Math.max(rMax,value);

//第一种 以头结点为二叉搜索树
if(left==lBST&&right==rBST&&lMax<value&&rMin>value)
{
record[0]=lSize+rSize+1;
return head;
}
//第二种 以非头结点为二叉搜索树
record[0]=Math.max(lSize,rSize);

return lSize>rSize?lBST:rBST;
}
//************************************************
//直观打印二叉树
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)
{
//System.out.println("Hello");
/**
6
1          12
0     3    10      13
4    14  20  16
2  5 11  15

*/
Node node=new Node(6);
node.left=new Node(1);
node.left.left=new Node(0);
node.left.right=new Node(3);

node.right=new Node(12);
node.right.left=new Node(10);
node.right.right=new Node(13);
node.right.left.left=new Node(4);
node.right.left.right=new Node(14);
node.right.left.left.left=new Node(2);
node.right.left.left.right=new Node(5);
node.right.left.right.left=new Node(11);
node.right.left.right.right=new Node(15);
node.right.right.left=new Node(20);
node.right.right.right=new Node(16);
printTree(node);

System.out.println();
Node mode=maxSearchTree(node); //寻找最大二叉搜索树
printTree(mode);
}

}


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