算法:二叉树的三种遍历 & 二叉搜索树的遍历

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
        }
    }
}

思路

  • 前序遍历:先根,再left,再right。例如5、324、768
  • 中序遍历:先left,再根,再right。例如234、5、678
  • 后序遍历:先left,再根,再right。例如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)

打印结果,和思路里面的一样

二叉搜索树

二叉搜索树(Binary Search Tree),就是从做到右依次递增的一个二叉树。如:

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

二叉树为什么这么重要

二分
尽量保持二叉树的平衡,否则如果这个二叉树只有左边,那不就成了链表了,没有二分的优势了

平衡二叉树:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
红黑树就是一种平衡二叉树。

猜你喜欢

转载自blog.csdn.net/weixin_43972437/article/details/130150906