找到二叉树中的最大搜索二叉子树
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); } }
相关文章推荐
- 数据结构 找到二叉树中的最大搜索二叉子树
- 二叉树问题---找到二叉树中的最大搜索二叉子树
- 找到二叉树中的最大搜索二叉子树
- 找到二叉树中符合搜索二叉树条件的最大拓扑结构
- 找到二叉树中符合搜索二叉树条件的最大拓扑结构
- 简单编程题目连载(十五)——找二叉树中的最大搜索二叉子树
- 找到二叉树中的最大搜索二叉树
- 有一个二叉树, 节点全部为整数,如何找到一个子树,它所有节点的和最大?要求编程序实现。
- 【BST】返回搜索二叉树最大的k个数
- 打印普通二叉树最大搜索子树
- 二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树
- 最大搜索二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树10:最大二叉搜索子树练习题
- C++关于搜索二叉树的建立,查询,删除,求最大,最小元素
- 二叉树10:最大二叉搜索子树
- 算法导论第十二章关于搜索二叉树的建立,查询,查找最大最小元素值,查找给定结点的直接后继
- 树——找到二叉树中的最大二叉搜索树
- Find Mode in Binary Search Tree:带重复元素的搜索二叉树Morris遍历查找频率最大的元素
- 给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
- 给定一个二叉树,找到最大路径和。该路径可以在树中的任何节点处开始和结束。