前端之数据结构(五)二叉树

386 阅读2分钟

这是我参与8月更文挑战的第六天,活动详情查看:8月更文挑战

上一章介绍的树的基本概念,并简单说了一下深度优先遍历和广度优先遍历。

这一章就来介绍一下树的另一种结构 二叉树 , 并唠唠它的先中后序遍历。

二叉树

  • 树中每个节点最多只能有两个子节点。

  • 下图就是一个现实中存在的二叉树,每个节点下都有两个字节点。说实话挺佩服拍照的人的,竟然真在现实生活中找到真实的二叉树。

image.png

  • JS 中通常用 Object 来模拟二叉树。如下代码:
const binaryTree = {
    val: 1,
    left: {
        val: 2,
        left: null,
        right: null
    }
    right: {
        val: 3,
        left: null,
        right: null
    }
}

就是一个简单的一个通过 JS Object 模拟的二叉树。

先序遍历

  • 访问根节点。

  • 对根节点的左子树进行先序遍历。

  • 对根节点的右子树进行先序遍历。

image.png

代码如下:

const binaryTree = {
    val: 1,
    left: {
        val: 2,
        left: {
            val: 3,
            left: null,
            right: null
        },
        right: {
            val: 4,
            left: {
                val: 5,
                left: null,
                right: null
            },
            right: null
        }
    },
    right: {
        val: 6,
        left: null,
        right: {
            val: 7,
            left: null,
            right: null
        }
    }
}

进行先序遍历:

const preorder = (root) => {
    if (!root) return
    console.log(root.val)
    preorder(root.left)
    preorder(root.right)
}

preorder(binaryTree)

// 1 2 3 4 5 6 7

中序遍历

  • 对根节点的左子树进行中序遍历。

  • 访问根节点。

  • 对根节点的右子树进行中序遍历。

image.png

代码如下:

const binaryTree = {
    val: 5,
    left: {
        val: 2,
        left: {
            val: 1,
            left: null,
            right: null
        },
        right: {
            val: 4,
            left: {
                val: 3,
                left: null,
                right: null
            },
            right: null
        }
    },
    right: {
        val: 6,
        left: null,
        right: {
            val: 7,
            left: null,
            right: null
        }
    }
}

进行中序遍历:

const inorder = (root) => {
    if (!root) return
    inorder(root.left)
    console.log(root.val)
    inorder(root.right)
}

inorder(binaryTree)
// 1 2 3 4 5 6 7

后序遍历

  • 对根节点的左子树进行中序遍历。

  • 对根节点的右子树进行中序遍历。

  • 访问根节点。

image.png

代码结构如下:

const binaryTree = {
    val: 7,
    left: {
        val: 4,
        left: {
            val: 1,
            left: null,
            right: null
        },
        right: {
            val: 3,
            left: {
                val: 2,
                left: null,
                right: null
            },
            right: null
        }
    },
    right: {
        val: 6,
        left: null,
        right: {
            val: 5,
            left: null,
            right: null
        }
    }
}

进行后序遍历:

const postorder = (root) => {
    if (!root) return
    postorder(root.left)
    postorder(root.right)
    console.log(root.val)
}

postorder(binaryTree)
// 1 2 3 4 5 6 7

End~~~