图论入门【数据结构基础】:什么是树?如何表示树?
之前我们有分别讲解二叉树的三种遍历的相关代码实现:
⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C++实现)Binary Tree Preorder Traversal
⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C++实现)Binary Tree Inorder Traversal
⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal
二叉树的三种遍历【树的遍历】(C++实现)Binary Tree Traversal
二叉搜索树(BST)有一个非常重要的性质:中序遍历的结果是一个严格递增的序列。 如果对一棵二叉搜索树进行中序遍历(Inorder Traversal),得到的节点值的序列一定是从小到大严格递增的。
什么是中序遍历?
中序遍历是一种遍历二叉树的方式,顺序是:
- 遍历左子树。
- 访问根节点。
- 遍历右子树。
为什么 BST 的中序遍历是严格递增的?
二叉搜索树的定义是:
- 左子树的所有节点的值都小于根节点的值。
- 右子树的所有节点的值都大于根节点的值。
- 左右子树也必须是二叉搜索树。
根据这个定义,中序遍历的过程会先访问左子树(较小的值),然后访问根节点(中间的值),最后访问右子树(较大的值)。因此,遍历的结果一定是严格递增的。
举个例子
假设有一棵二叉搜索树:
4
/ \
2 5
/ \
1 3
对这棵树进行中序遍历:
- 遍历左子树 2:
- 遍历左子树 1,访问 1。
- 访问 2。
- 遍历右子树 3,访问 3。
- 访问根节点 4。
- 遍历右子树 5,访问 5。
- 最终的中序遍历结果是:[1, 2, 3, 4, 5],这是一个严格递增的序列。
如何利用这个性质?
我们可以利用中序遍历的结果来判断一棵树是否是二叉搜索树:
- 对树进行中序遍历,记录遍历的结果。
- 检查遍历结果是否是严格递增的。
- 如果是,则说明这是一棵二叉搜索树。
- 如果不是,则说明这不是一棵二叉搜索树。
98. Validate Binary Search Tree
Given the root
of a binary tree, determine if it is a valid binary search tree (BST).
A valid 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.
A subtree of
treeName
is a tree consisting of a node intreeName
and all of its descendants.
Example 1:
Input: root = [2,1,3]
Output: true
Example 2:
Input: root = [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.
C++ 实现
bool isValidBST(TreeNode* root) {
vector<int> inorder;
inorderTraversal(root, inorder); // 中序遍历
for (int i = 1; i < inorder.size(); i++) {
if (inorder[i] <= inorder[i-1]) { // 检查是否严格递增
return false;
}
}
return true;
}
void inorderTraversal(TreeNode* node, vector<int>& result) {
if (node == nullptr) return;
inorderTraversal(node->left, result); // 遍历左子树
result.push_back(node->val); // 访问根节点
inorderTraversal(node->right, result); // 遍历右子树
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的节点数,每个节点被访问一次。
- 空间复杂度:
- 递归解法: O ( n ) O(n) O(n),递归栈的深度。
- 迭代解法: O ( n ) O(n) O(n),栈的空间。