• Careercup


    2014-05-02 07:18

    题目链接

    原题:

    boolean isBST(const Node* node) { 
    // return true iff the tree with root 'node' is a binary search tree. 
    // 'node' is guaranteed to be a binary tree. 
    } 
    
      n
     / 
    a   b
         
          c

    题目:检查一棵二叉树是否为二叉搜索树。

    解法:二叉搜索树,就是每个节点的左边全都小于它,右边全都大于它。如果真的对于每个节点都全部检查左右边的每个节点,就做了很多重复劳动。只需要判断每个节点的左子树最靠右,和右子树最靠左的节点是否小于和大于它即可。递归过程中传递引用可以随时更新两个需要检查的值。请看代码。

    代码:

      1 // http://www.careercup.com/question?id=5632735657852928
      2 #include <climits>
      3 #include <iostream>
      4 #include <sstream>
      5 #include <string>
      6 using namespace std;
      7 
      8 struct TreeNode {
      9     int val;
     10     TreeNode *left;
     11     TreeNode *right;
     12     TreeNode(int _val = 0): val(_val), left(nullptr),right(nullptr) {};
     13 };
     14 
     15 class Solution {
     16 public:
     17     bool isBST(TreeNode *root) {
     18         if (root == nullptr) {
     19             return false;
     20         }
     21         
     22         max_val = INT_MIN;
     23         res = true;
     24         first_node = true;
     25         isBSTRecursive(root);
     26         
     27         return res;
     28     };
     29 private:
     30     int max_val;
     31     bool res;
     32     bool first_node;
     33     
     34     void isBSTRecursive(TreeNode *root) {
     35         if (!res) {
     36             return;
     37         }
     38         
     39         // root is guaranteed to be not nullptr.
     40         if (root->left) {
     41             isBSTRecursive(root->left);
     42         }
     43         if (first_node || root->val > max_val) {
     44             first_node = false;
     45             max_val = root->val;
     46         } else {
     47             res = false;
     48             return;
     49         }
     50         if (root->right) {
     51             isBSTRecursive(root->right);
     52         }
     53     };
     54 };
     55 
     56 void construcTree(TreeNode *&root)
     57 {
     58     int val;
     59     stringstream sio;
     60     string s;
     61     
     62     if (cin >> s && s != "#") {
     63         sio << s;
     64         sio >> val;
     65         root = new TreeNode(val);
     66         construcTree(root->left);
     67         construcTree(root->right);
     68     } else {
     69         root = nullptr;
     70     }
     71 }
     72 
     73 void deleteTree(TreeNode *&root)
     74 {
     75     if (root == nullptr) {
     76         return;
     77     }
     78     deleteTree(root->left);
     79     deleteTree(root->right);
     80     delete root;
     81     root = nullptr;
     82 }
     83 
     84 int main()
     85 {
     86     TreeNode *root;
     87     Solution sol;
     88     
     89     while (true) {
     90         construcTree(root);
     91         if (root == nullptr) {
     92             break;
     93         }
     94         
     95         cout << (sol.isBST(root) ? "Valid BST" : "Invalid BST") << endl;
     96         
     97         deleteTree(root);
     98     }
     99     
    100     return 0;
    101 }
  • 相关阅读:
    wxPython跨线程调用
    安卓开发24:FrameLayout布局
    URAL 1081
    [置顶] Hibernate运行机理
    [置顶] Hibernate的一个经典异常
    poj1190 生日蛋糕 dfs
    [置顶] 自己写代码生成器之生成Dal层代码(获取数据库所有表名称)
    修改mysql数据存储的地址
    拖延心理学
    DeepLearnToolbox使用总结
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3703636.html
Copyright © 2020-2023  润新知