二叉树与遍历应用场景

219 阅读2分钟

什么是二叉树

  • 二叉树是树形结构,其每个节点最多有两个子节点,称为左节点和右节点。
  • 相对较小的值保存在左节点中,较大的值保存在右节点中。这一特性使得查找的效率很高,对于数值型和非数值型的数据。

实现简单的二叉树

// 节点
class Node {
    constructor(data) {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}

class BinaryTree {
    constructor() {
        this.root = null;
    }
    // 插入节点
    insert(data) {
        let node = new Node(data);
        if (this.root === null) {
            this.root = node;
        } else {
            this.insertNode(this.root, node)
        }
    }
    // 插入节点
    insertNode(root, node) {
        if (root.data < node.data) {
            if (root.right == null) {
                root.right = node;
            } else {
                this.insertNode(root.right, node);
            }
        } else {
            if (root.left == null) {
                root.left = node;
            } else {
                this.insertNode(root.left, node);
            }
        }
    }

    // 中序遍历 左根右 排序与查找、验证二叉树
    inOrder(root) {
        if (root != null) {
            this.inOrder(root.left);
            console.log(root.data);
            this.inOrder(root.right);
        }
    }
    // 前序遍历 根左右 复制树结构
    preOrder(root) {
        if (root != null) {
            console.log(root.data);
            this.preOrder(root.left);
            this.preOrder(root.right);
        }
    }
    // 后序遍历 左右根 计算子树信息、释放资源
    postOrder(root) {
        if (root != null) {
            this.postOrder(root.left);
            this.postOrder(root.right);
            console.log(root.data);
        }
    }
}

let Tree = new BinaryTree();
Tree.insert(6);
Tree.insert(1);
Tree.insert(0);
Tree.insert(9);
Tree.insert(7);
// Tree.inOrder(Tree.root);
Tree.preOrder(Tree.root);

/**
 * 绘制结果
      6
    /   \
   1     9
  / \   /
 0   5 7
 */

二叉树排序应用场景

中序遍历

  • 排序与查找
    • 在二叉搜索树中,中序遍历会得到一个递增的序列,这可以直接用于排序算法或高效地查找特定值。
  • 验证二叉搜索
    • 通过比较中序遍历的结果是否为升序序列,可以判断一棵树是否满足二叉搜索树的性质。

前序遍历

  • 复制树结构
    • 前序遍历首先访问根节点,这使得它非常适合于复制或克隆二叉树结构,因为可以先创建根节点,再递归地创建左子树和右子树。

后序遍历

  • 计算子树信息
    • 当需要基于子树的信息(如子树的大小、节点值之和等)来更新当前节点的值时,后序遍历非常有用,因为它在访问根节点前已经处理了所有子节点。
  • 释放资源
    • 在需要递归释放内存或关闭文件等资源的操作中,后序遍历确保了子节点的资源先于父节点被释放,符合资源管理的最佳实践。