problem:
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node‘s key.
- The right subtree of a node contains only nodes with keys greater than the node‘s key.
- Both the left and right subtrees must also be binary search trees.
confused what "{1,#,2,3}"
means? >
read more on how binary tree is serialized on OJ.
Hide Tags
题意:判断一颗二叉树是否为搜索二叉树,注意搜索二叉树的性质:左子树的所有节点小于父节点,
右子树的所有节点大于父节点
thinking:
(1)开始试着用递归写了一个程序,对搜索二叉树的定义曲解了。仅仅比较了左孩子和右孩子。是错的。
class Solution { public: bool isValidBST(TreeNode *root) { if(root==NULL) return true; TreeNode *parent = root; TreeNode *left_child=parent->left; TreeNode *right_child=parent->right; bool r=true; bool l=true; if(left_child!=NULL) { if(left_child->val<parent->val) l=isValidBST(left_child); else l=false; } if(right_child!=NULL) { if(right_child->val>parent->val) r=isValidBST(right_child); else r=false; } return l&&r; } };
(2)正确解法是:中序遍历。采用DFS(非递归法)中序遍历二叉树,节点的VAL 应该是一个递增序列。
code:
class Solution { public: bool isValidBST(TreeNode *root) { vector<int> ret=inorderTraversal(root); int n=ret.size(); if(n<2) return true; for(int i=1;i<n;i++) { if(ret[i]<=ret[i-1]) return false; } return true; } protected: vector<int> inorderTraversal(TreeNode *root) { vector<int> ret; stack<TreeNode*> _stack; TreeNode *tmp=root; while(tmp!=NULL || !_stack.empty()) { if(tmp!=NULL) { _stack.push(tmp); tmp=tmp->left; } else { tmp=_stack.top(); _stack.pop(); ret.push_back(tmp->val); tmp=tmp->right; } } return ret; } };
时间: 2024-10-07 14:14:57