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