二叉树
- 是一棵树
- 每个节点,最多只能由2个子节点
- 树节点的数据结构 { value, left?, right?}
二叉树的遍历
- 前序遍历: root -> left -> right
- 中序遍历: left -> root -> right
- 后序遍历: left -> right -> root
以下图二叉树为例:
基础二叉树及其遍历代码
interface ITreeNode {
value: number
left: ITreeNode | null
right: ITreeNode | null
}
function preOrderTraverse(node: ITreeNode | null) {
if (node == null) return
console.log(node.value)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
}
function inOrderTraverse(node: ITreeNode | null) {
if (node == null) return
inOrderTraverse(node.left)
console.log(node.value)
inOrderTraverse(node.right)
}
function postOrderTraverse(node: ITreeNode | null) {
if (node == null) return
postOrderTraverse(node.left)
postOrderTraverse(node.right)
console.log(node.value)
}
const treeNode: ITreeNode = {
value: 5,
left: {
value: 3,
left: {
value: 2,
left: null,
right: null,
},
right: {
value: 4,
left: null,
right: null,
},
},
right: {
value: 7,
left: {
value: 6,
left: null,
right: null,
},
right: {
value: 8,
left: null,
right: null,
},
},
}
console.log('pre')
preOrderTraverse(treeNode)
console.log('in')
inOrderTraverse(treeNode)
console.log('post')
postOrderTraverse(treeNode)
结果:
二叉搜索树
- left(包括其后代) value <= root value
- right(包括其后代) value >= root value
解题思路
- BST中序遍历,即从小到大的排序
- 找到排序后的第k值即可
代码
interface ITreeNode {
value: number
left: ITreeNode | null
right: ITreeNode | null
}
const arr: number[] = []
function inOrderTraverse(node: ITreeNode | null) {
if (node == null) return
inOrderTraverse(node.left)
arr.push(node.value)
inOrderTraverse(node.right)
}
function getKthValue(node: ITreeNode, k: number): number | null {
inOrderTraverse(node)
return arr[k - 1] || null
}
const bst: ITreeNode = {
value: 5,
left: {
value: 3,
left: {
value: 2,
left: null,
right: null,
},
right: {
value: 4,
left: null,
right: null,
},
},
right: {
value: 7,
left: {
value: 6,
left: null,
right: null,
},
right: {
value: 8,
left: null,
right: null,
},
},
}
console.log(getKthValue(bst,3)) // 4
划重点
- 二叉搜索树的价值:可以使用二分法进行快速查找