剑指offer:01二维数组中的查找

二叉排序树的定义:二叉排序树,又称为二叉查找树。它或者是一颗空树,或者具有下列性质的二叉树。

    若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

    若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

    它的左、右子树也分别为二叉排序树。

 这种树模式下的搜索途径可以遍历或预判所有可能性

“比大小"式的搜索路径一定构成二叉排序树(例:两人猜数,甲心里想一个数,乙去猜,甲对乙的每次猜测告知其大了还是小了,由第一次直到最后一次正确猜测的路径一定是一棵二叉排序树。

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例:
1 2 4 6
2 3 5 8
3 5 7 9
5 9 11 12

解析:所给出的数组去掉这课具有重叠枝叶的大树中某些相邻节点间的路径后一定包含一棵二叉排序树

所给出的数组从右上角或左下角开始的以左或右路径分别形成更小分支和更大分支,虽然这是一棵不严格的”二叉排序树“,但是这种途径仍然可以遍历或预判所有可能性,而从左上角或右下角开始的左右分支都是更大或更小分支,这种搜索途径不会遍历和预判所有可能性。

从右上角开始搜索的代码:

 1 class Solution {
 2 public:
 3     bool Find(int target, vector<vector<int> > array) {
 4         int row = array.size(), col = array[0].size();
 5         int i = 0, j = col-1;
 6         while(i<row && j>=0){
 7             if(array[i][j] == target){
 8                 return true;
 9             }
10             else{
11                  array[i][j]>target ? --j : ++i;
12             }
13         }
14         return false;
15     }
16 };
原文地址:https://www.cnblogs.com/CreatorKou/p/8575967.html