interface IBinaryTree {
value: number
left: IBinaryTree | null
right: IBinaryTree | null
}
const Tree:IBinaryTree = {
value: 5,
left: {
value: 3,
left: {
value: 2,
left:null,
right:null
},
right:{
value: 3,
left: null,
right: null
}
},
right:{
value: 7,
left: {
value: 6,
left: null,
right: null
},
right: {
value: 8,
left:null,
right:null
}
}
}
/**
* 二叉树前序遍历===> 根左右
* @param tree
*/
function preOrderTraverse (tree:IBinaryTree) {
if (!tree) return
console.log(tree.value)
preOrderTraverse(tree.left as IBinaryTree)
preOrderTraverse(tree.right as IBinaryTree)
}
/**
* 二叉树中序遍历===> 左根右
* @param tree
*/
function inOrderTraverse (tree: IBinaryTree) {
if (!tree) return
inOrderTraverse(tree.left as IBinaryTree)
console.log(tree.value)
inOrderTraverse(tree.right as IBinaryTree)
}
/**
* 二叉树后续遍历===> 左右根
* @param tree
*/
function postOrderTraverse (tree: IBinaryTree) {
if (!tree) return
postOrderTraverse(tree.left as IBinaryTree)
postOrderTraverse(tree.right as IBinaryTree)
console.log(tree.value)
}
preOrderTraverse(Tree)
结果
5
3
2
4
7
6
8
inOrderTraverse(Tree)
结果
2
3
4
5
6
7
8
postOrderTraverse(Tree)
结果
2
4
3
6
8
7
5
const arr:number[] = []
/**
* 二叉树中序遍历===> 左根右
* @param tree
*/
function inOrderTraverse (tree: IBinaryTree) {
if (!tree) return
inOrderTraverse(tree.left as IBinaryTree)
// console.log(tree.value)
arr.push(tree.value)
inOrderTraverse(tree.right as IBinaryTree)
}
/**
* 获取二叉树第K值
*/
function getKthValue(tree:IBinaryTree,k:number):number | null {
inOrderTraverse(tree)
return arr[k-1] || null
}
console.log(getKthValue(Tree,2))//3
这里的4恰好是数组下标1对应的数,即arr[k-1] === 4.
describe('二叉搜索树',() => {
const Tree:IBinaryTree = {
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
}
}
}
it('正常情况',() => {
const res = getKthValue(Tree,2)
expect(res).toBe(3)
})
it('k 超出范围时',() => {
const res = getKthValue(Tree,10)
expect(res).toBeNull()
})
})