PAT Advanced Level 1043. Is It a Binary Search Tree (25)(Java and C++)
来源:互联网 发布:淘宝卖家如何开直播 编辑:程序博客网 时间:2024/06/05 02:59
1043. Is It a Binary Search Tree (25)
输入:
7
8 6 5 7 10 8 11(前序遍历结果)
输出:
YES (是BST)
5 7 6 8 11 10 8(后序遍历结果)
或者
NO (不是BST)
二叉查找树的生成方法。
方法一:前序遍历结果已得到。BST的中序遍历结果就是所有值按从小到大的顺序的序列(再分情况考虑镜像)。
由前序遍历结果和中序遍历结果,构建二叉树。(参考PAT A1020 和微软编程之美3.9的思路)
判断输入是否为BST:采用了在生成树的过程中判断。(带来了风险,可能会漏考虑某种情况)
方法二:新插入的子节点 < 父节点,则插往左子树;新插入的子节点 >= 父节点,则插往右子树。
判断输入是否为BST:先按生成二叉树的方法,生成树,再将得到生成树的前序遍历结果,与输入的前序遍历结果比较。相同,则为BST,不同则不是。
结果:按照方法一,我花了大约一整天时间,最终代码有一个测试点未通过。
按照方法二,逻辑更加清晰,全部通过。
Java代码(方法一,一个测试点未通过):
import java.util.Arrays;import java.util.Scanner;public class Main {static int[] arrInOrder;static int[] arrPreOrder;static Main instance =new Main();static boolean isBst =true;public static void main(String[] arg){Scanner sc =new Scanner (System.in);int n =Integer.parseInt(sc.nextLine().trim());String[] arr_str =sc.nextLine().trim().split(" ");if(n==1){System.out.println("YES");System.out.println(arr_str[0]);}else{arrPreOrder= new int[n]; arrInOrder = new int[n]; for(int i=0;i<arrInOrder.length;i++){ arrPreOrder[i]=Integer.parseInt(arr_str[i]); arrInOrder [i]=arrPreOrder[i]; } int isImage=-1; if(arrInOrder[0]>arrInOrder[1]){ isImage = 0; } else{ isImage = 1; } Arrays.sort(arrInOrder); Node root =buildTree(arrPreOrder, arrInOrder, 0, 0, arrPreOrder.length, null,isImage); if(isBst){ System.out.println("YES"); postOrderTraversalBST(root, 10086); } else{ System.out.println("NO"); } } }public static Node buildTree(int[] arrPreOrder ,int[] arrInOrder, int p_PreOrder ,int p_InOrder , int treeLen ,Node root,int isImage){ if(root == null){ if(p_PreOrder>arrPreOrder.length-1){ root =instance.new Node(arrPreOrder[arrPreOrder.length-1]); } else{ root =instance.new Node(arrPreOrder[p_PreOrder]); } } //4 //10 20 10 20 if(treeLen ==1 && root.val != arrInOrder[p_InOrder]){ isBst = false; return null; } if(treeLen ==1 && root.val == arrInOrder[p_InOrder]){ return root; } if(isImage==0){ int p_InOrder_bak =p_InOrder; while(root.val != arrInOrder[p_InOrder]){ p_InOrder++; if(p_InOrder>arrInOrder.length-1){ isBst=false; return null; } } int leftLen = p_InOrder - p_InOrder_bak +1 -1; int rightLen = treeLen -1-leftLen; if(leftLen >0 ){ root.left =buildTree(arrPreOrder, arrInOrder, p_PreOrder+1, p_InOrder_bak, leftLen, null,isImage); } if(rightLen>0){ root.right=buildTree(arrPreOrder, arrInOrder, p_PreOrder + leftLen + 1, p_InOrder_bak+leftLen+1, rightLen, null,isImage); } } else{ int p_InOrder_bak = p_InOrder; while(root.val != arrInOrder[p_InOrder]){ p_InOrder++; if(p_InOrder>arrInOrder.length-1){ isBst=false; return null; } } int leftLen = p_InOrder - p_InOrder_bak +1 -1; int rightLen = treeLen -1 -leftLen; if(rightLen>0){ root.left = buildTree(arrPreOrder, arrInOrder, p_PreOrder+1, p_InOrder_bak+leftLen+1, rightLen, null, isImage); } if(leftLen>0){ root.right=buildTree(arrPreOrder, arrInOrder, p_PreOrder+leftLen+1, p_InOrder_bak, leftLen, null, isImage); } } return root;}public static void postOrderTraversalBST(Node root,int len){if(root != null){if(root.left != null){postOrderTraversalBST(root.left,len-1);}if(root.right != null){postOrderTraversalBST(root.right,len-1);}System.out.print(root.val);if(len!= 10086){ System.out.print(" ");}}}class Node {int val;Node left;Node right;public Node(int value){val =value;left =null;right =null;}}}
Java代码(方法二,全部测试点通过):
import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class Main {static int[] arrPreOrder;static Main instance = new Main();public static void main(String[] arg) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.nextLine().trim()); String line= sc.nextLine().trim();String[] arr_str = line.split(" ");arrPreOrder = new int[n];for (int i = 0; i < n; i++) {arrPreOrder[i] = Integer.parseInt(arr_str[i]);}if(n==1){System.out.println("YES");System.out.println(arrPreOrder[0]);}else{int isImage =-1;if(arrPreOrder[0]>arrPreOrder[1]){isImage = 0;}else{isImage = 1;}Node root =buildTree(isImage);preOrderTraversalBST(root);String res_preTraversal ="";while(!queue.isEmpty()){res_preTraversal += (queue.poll()+" ");}res_preTraversal=res_preTraversal.trim();if(res_preTraversal.equals(line)){System.out.println("YES");postOrderTraversalBST(root,10086);}else{System.out.println("NO");}}}public static Node buildTree(int isImage){Node root =null;for(int i=0;i<arrPreOrder.length;i++){ root = insertNode(root, arrPreOrder[i],isImage); }return root;}public static Node insertNode(Node parent, int value,int isImage) {if (parent == null) {parent = instance.new Node(value); return parent;}if(isImage == 0){if(value < parent.val){parent.left =insertNode(parent.left, value,isImage);}else{parent.right=insertNode(parent.right, value,isImage);}}else{if(value >= parent.val){parent.left =insertNode(parent.left, value,isImage);}else{parent.right=insertNode(parent.right, value,isImage);}}return parent;}static Queue<Integer> queue =new LinkedList<Integer>();public static void preOrderTraversalBST(Node root){if(root != null){ queue.add(root.val);// System.out.print(root.val+" "); if(root.left!=null){ preOrderTraversalBST(root.left); } if(root.right!=null){ preOrderTraversalBST(root.right); }}}public static void postOrderTraversalBST(Node root,int len){if(root != null){if(root.left != null){postOrderTraversalBST(root.left,len-1);}if(root.right != null){postOrderTraversalBST(root.right,len-1);}System.out.print(root.val);if(len!= 10086){ System.out.print(" ");}}}class Node {int val;Node left;Node right;public Node(int value) {val = value;left = null;right = null;}}}
C++代码:
推荐博客
http://www.cnblogs.com/yanhaiming/archive/2012/11/26/2789863.html
0 0
- PAT Advanced Level 1043. Is It a Binary Search Tree (25)(Java and C++)
- 1043. Is It a Binary Search Tree (25)【二叉树】——PAT (Advanced Level) Practise
- 【PAT】【Advanced Level】1043. Is It a Binary Search Tree (25)
- PAT (Advanced) 1043. Is It a Binary Search Tree (25)
- 浙大PAT (Advanced Level) Practise 1043Is It a Binary Search Tree (25)
- PAT (Advanced Level) Practise 1043 Is It a Binary Search Tree (25)
- PAT (Advanced Level) Practise 1043 Is It a Binary Search Tree (25)
- Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)
- Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)
- PAT (Advanced Level) 1043. Is It a Binary Search Tree (25) 判断序列是否为BST的先序遍历,递归
- PAT-1043. Is It a Binary Search Tree(BST java)
- PAT A 1043. Is It a Binary Search Tree (25)
- PAT-A-1043. Is It a Binary Search Tree (25)
- pat-a 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree (25)—PAT
- 【PAT】1043. Is It a Binary Search Tree (25)
- 浙大 PAT 1043. Is It a Binary Search Tree (25)
- PAT 1043. Is It a Binary Search Tree (25)
- Chapter 1 A Tour of Computer Systems 《CSAPP》笔记
- sigaction 读取和修改与指定信号相关联的处理动作 捕捉信号ctr+c
- Shell常识--printf格式指示符--总结自《Linux Shell 脚本攻略》
- shell学习之()与{}的使用
- Apache Apollo配置文件解析
- PAT Advanced Level 1043. Is It a Binary Search Tree (25)(Java and C++)
- java 数组对象
- dataset导成excel输出
- c++之拷贝构造函数的研究
- ASP.NET MVC中实现多个按钮提交的几种方法
- Android 自定义权限 (<permission> <uses-permission>)
- iPhone6运营商暗战:有节操才会赢
- 美国的“今日头条”是怎么做的?
- 关于虚拟主机中ftp的使用常识-易网主机解释