アルゴリズム: 二分木の 3 回の走査 & 二分探索木の走査

jsはバイナリツリーを表します

2
3
4
5
6
7
8
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)

アイデアと同じように結果を出力します

二分探索木

二分探索木は右から左に増加する二分木です。好き:

2
3
4
5
6
7
8

トラバーサルは、順序付けられた配列をフラット化することと同じ、順序どおりのトラバーサルに適しています。

/**
 * 寻找 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 を超えず、左右のサブツリーの両方がバランスのとれた二分木です。
赤黒ツリーはバランスの取れた二分木です。

おすすめ

転載: blog.csdn.net/weixin_43972437/article/details/130150906