jsはバイナリツリーを表します
interface ITreeNode {
value: number
left: ITreeNode | null
right: ITreeNode | 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
}
}
}
一連の考え
- 事前順序トラバーサル: 最初にルート、次に左、次に右。例: 5、324、768
- 順序通りの走査: 最初に左、次にルート、次に右。例: 234、5、678
- 事後トラバーサル: 最初に左、次にルート、次に右。例: 243、687、5
コード
export interface ITreeNode {
value: number
left: ITreeNode | null
right: ITreeNode | null
}
const arr: number[] = []
/**
* 二叉树前序遍历
* @param node tree node
*/
function preOrderTraverse(node: ITreeNode | null) {
if (node == null) return
console.log(node.value)
arr.push(node.value)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
}
/**
* 二叉树中序遍历
* @param node tree node
*/
function inOrderTraverse(node: ITreeNode | null) {
if (node == null) return
inOrderTraverse(node.left)
console.log(node.value)
arr.push(node.value)
inOrderTraverse(node.right)
}
/**
* 二叉树后序遍历
* @param node tree node
*/
function postOrderTraverse(node: ITreeNode | null) {
if (node == null) return
postOrderTraverse(node.left)
postOrderTraverse(node.right)
console.log(node.value)
arr.push(node.value)
}
テスト
preOrderTraverse(bst)
inOrderTraverse(bst)
postOrderTraverse(bst)
アイデアと同じように結果を出力します
二分探索木
二分探索木は右から左に増加する二分木です。好き:
トラバーサルは、順序付けられた配列をフラット化することと同じ、順序どおりのトラバーサルに適しています。
/**
* 寻找 BST 里的第 K 小值
* @param node tree node
* @param k 第几个值
*/
export function getKthValue(node: ITreeNode, k: number): number | null {
inOrderTraverse(node)
return arr[k - 1] || null
}
console.log(getKthValue(bst, 3))
出力は4です
二分木がなぜそれほど重要なのか
Binary
二分木のバランスを保つようにしてください。そうしないと、二分木が左側だけだと連結リストになってしまい、二分木の利点がありません。
バランスの取れた二分木:
空のツリーであるか、左右のサブツリー間の高さの差の絶対値が 1 を超えず、左右のサブツリーの両方がバランスのとれた二分木です。
赤黒ツリーはバランスの取れた二分木です。