Skip to content

Commit b3472e5

Browse files
committed
add leetcode challege for validate is Binary Search Tree
1 parent be357f0 commit b3472e5

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { describe, test, expect } from 'bun:test';
2+
import { TreeNode, isValidBST } from './validate-binary-search-tree';
3+
4+
describe('isValidBST', () => {
5+
test('should return true for a valid BST', () => {
6+
const tree = new TreeNode(2, new TreeNode(1), new TreeNode(3));
7+
expect(isValidBST(tree)).toBe(true);
8+
});
9+
10+
test('should return false for an invalid BST (left child greater than parent)', () => {
11+
const tree = new TreeNode(5, new TreeNode(1), new TreeNode(4, new TreeNode(3), new TreeNode(6)));
12+
expect(isValidBST(tree)).toBe(false);
13+
});
14+
15+
test('should return false for an invalid BST (right child less than parent) - Special case for unbalance tree - will solve later!', () => {
16+
const tree = new TreeNode(5, new TreeNode(4), new TreeNode(6, new TreeNode(3), new TreeNode(7)));
17+
expect(isValidBST(tree)).toBe(false);
18+
});
19+
20+
test('should return true for a single node tree', () => {
21+
const tree = new TreeNode(1);
22+
expect(isValidBST(tree)).toBe(true);
23+
});
24+
25+
test('should return true for an empty tree', () => {
26+
const tree = null;
27+
expect(isValidBST(tree)).toBe(true);
28+
});
29+
30+
test('should return true for a valid BST with duplicate values on the left', () => {
31+
const tree = new TreeNode(2, new TreeNode(1), new TreeNode(2));
32+
expect(isValidBST(tree)).toBe(false); // Duplicate values should invalidate the BST
33+
});
34+
35+
test('should return true for a valid BST with duplicate values on the right', () => {
36+
const tree = new TreeNode(2, new TreeNode(1), new TreeNode(2));
37+
expect(isValidBST(tree)).toBe(false); // Duplicate values should invalidate the BST
38+
});
39+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* class TreeNode {
4+
* val: number
5+
* left: TreeNode | null
6+
* right: TreeNode | null
7+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.left = (left===undefined ? null : left)
10+
* this.right = (right===undefined ? null : right)
11+
* }
12+
* }
13+
*/
14+
15+
export class TreeNode {
16+
val: number
17+
left: TreeNode | null
18+
right: TreeNode | null
19+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
20+
this.val = (val === undefined ? 0 : val)
21+
this.left = (left === undefined ? null : left)
22+
this.right = (right === undefined ? null : right)
23+
}
24+
25+
}
26+
27+
export function isValidBST(root: TreeNode | null): boolean {
28+
if (root == null) return true
29+
let currentNode: any = root;
30+
let list = []
31+
let queue = []
32+
queue.push(currentNode)
33+
34+
while (queue.length > 0) {
35+
console.log(currentNode.val);
36+
currentNode = queue.shift(); // O(n) => Queue để lưu trữ các node ở phía tước
37+
list.push(currentNode.val) // O(1)
38+
if (currentNode.left) {
39+
if (currentNode.val <= currentNode.left.val) return false
40+
queue.push(currentNode.left) // O(1)
41+
}
42+
if (currentNode.right) {
43+
if (currentNode.val >= currentNode.right.val) return false
44+
queue.push(currentNode.right) // O(1)
45+
}
46+
}
47+
48+
return true
49+
};
50+
51+
const tree = new TreeNode(2, new TreeNode(1), new TreeNode(3));
52+
const tree2 = new TreeNode(5, new TreeNode(1, null, null), new TreeNode(4, new TreeNode(3), new TreeNode(6)));
53+
const tree3 = new TreeNode(5, new TreeNode(4, null, null), new TreeNode(6, new TreeNode(3), new TreeNode(7))); // Cây không cân bằng. Trường hợp này giải quyết như thế nào ?
54+
55+
56+
console.log(tree);
57+
console.log(isValidBST(tree));
58+
console.log(isValidBST(tree2));

0 commit comments

Comments
 (0)