1 //1 二叉搜索树的判定 2 //method 1 利用中序遍历(最优解) 对于任一结点 若它后一个结点的值大于它的值 则为二叉搜索树 3 //时间复杂度: O(n) 空间复杂度: O(1) 4 public boolean isBST(BiTNode node) 5 { 6 if(node == null) 7 return true; 8 9 //中序遍历 10 if(!isBST(node.lchild)) 11 return false; 12 if(pre != null && node.data <= pre.data) 13 return false; 14 pre = node; 15 if(!isBST(node.rchild)) 16 return false; 17 return true; 18 } 19 20 //method 2 对于任一结点 若其左右子树均为二叉搜索树且其值大于左子树的最大值 小于右子树的最小值 则为二叉搜索树 21 //效率低于第1种方法 22 public boolean isBST(BiTNode node) 23 { 24 if(node == null) 25 return true; 26 27 if(!isBST(node.lchild) || !isBST(node.rchild)) 28 return false; 29 if(node.lchild != null && node.data <= getMaxElement(node.lchild)) 30 return false; 31 if(node.rchild != null && node.data >= getMinElement(node.rchild)) 32 return false; 33 return true; 34 } 35 36 //错误方法 37 //该方法只能判定局部二叉树 区别于方法2 38 public boolean isBST(BiTNode node) 39 { 40 if(node == null) 41 return true; 42 43 if(!isBST(node.lchild) || !isBST(node.rchild)) 44 return false; 45 if(node.rchild != null && node.rchild.data <= node.data) 46 return false; 47 if(node.lchild != null && node.lchild.data >= node.data) 48 return false; 49 return true; 50 }
1 //2 查找最大元素 2 //递归 3 public int getMaxElement(BiTNode node) 4 { 5 if(node.rchild == null) 6 return node.data; 7 8 return getMaxElement(node.rchild); 9 } 10 11 //迭代 12 public int findElement(int k, BiTNode node) 13 { 14 if(node == null) 15 return -1; // 查找失败 16 17 if(k > node.data) 18 return findElement(k, node.rchild); 19 else if(k < node.data) 20 return findElement(k, node.lchild); 21 else 22 return node.data; 23 }
1 //3 查找给定元素 2 //递归 3 public int findElement(int k, BiTNode node) 4 { 5 if(node == null) 6 return -1; // 查找失败 7 8 if(k > node.data) 9 return findElement(k, node.rchild); 10 else if(k < node.data) 11 return findElement(k, node.lchild); 12 else 13 return node.data; 14 } 15 16 //迭代 17 public int findElement(int k) 18 { 19 BiTNode p = this.root; 20 21 while(p != null && p.data != k) 22 { 23 if(k > p.data) 24 p = p.rchild; 25 else if(k < p.data) 26 p = p.lchild; 27 } 28 if(p == null) 29 return -1; 30 else 31 return p.data; 32 //简洁形式 33 //return p == null ? -1 : p.data; 34 }