Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121076
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-24 16:22
文章存档

2014年(53)

我的朋友

分类: C/C++

2014-12-06 18:21:44

需要牢记BST的定义:左边的所有节点都小于根节点,根节点小于右边的所有节点

所以这样的做法是错误的:


  1. bool isValidBST(TreeNode *root) {
  2.     if(root==NULL)
  3.         return true;
  4.     bool l=true;
  5.     bool r=true;
  6.     if(root->left!=NULL)
  7.         l=root->val>root->left->val;
  8.     if(root->right!=NULL)
  9.         r=root->val<root->right->val;
  10.     return l&&r&&isValidBST(root->left)&&isValidBST(root->right);
  11. }
而正确的做法应该是中序遍历,查看输出是不是有序的


  1. TreeNode * pre=NULL;
  2. bool isValidBST(TreeNode *root) {
  3.     if(root==NULL)
  4.         return true;
  5.     bool l=isValidBST(root->left);
  6.     if(pre==NULL)
  7.         pre=root;
  8.     else{
  9.         if(root->val<=pre->val){
  10.             return false;
  11.         }
  12.         pre=root;
  13.     }
  14.     bool r=isValidBST(root->right);
  15.     return l&&r;
  16. }
还有一种更直观的
  1. TreeNode * pre=NULL;
  2. bool flag=true;
  3. void f(TreeNode *root) {
  4.     if(root==NULL)
  5.         return;
  6.     f(root->left);
  7.     if(pre==NULL)
  8.         pre=root;
  9.     else{
  10.         if(root->val<=pre->val){
  11.             flag=false;
  12.             return;
  13.         }
  14.         pre=root;
  15.     }
  16.     f(root->right);
  17.     return;
  18. }
  19. bool isValidBST(TreeNode *root) {
  20.     f(root);
  21.     return flag;
  22. }




阅读(1396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~