• 实现二叉树以及遍历二叉树


    实现二叉树

    定义节点:

    //定义节点
    function Node(data, left, right) {
        this.data = data;
        this.left = left;
        this.right = right;
        this.show = show;
    }
    //显示节点数据
    function show() {
        return this.data;
    }

    实现二叉树类前,我们要先知道插入实现算法

    查找正确插入点的算法如下。
    (1) 设根节点为当前节点。
    (2) 如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反之,执行第4 步。
    (3) 如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。
    (4) 设新的当前节点为原节点的右节点。
    (5) 如果当前节点的右节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。

    //定义二叉树类
    function BT() {
        this.root = null;
        this.insert = insert;
        this.inOrder = inOrder;
    }
    
    function insert(data) {
        var n = new Node(data, null, null);
        if (this.root == null) {
            this.root = n;
        }
        else {
            var current = this.root;
            var parent;
            while (true) {
                parent = current;
                if (data < current.data) {
                    current = current.left;
                    if (current == null) {
                        parent.left = n;
                        break;
                    }
                }
                else {
                    current = current.right;
                    if (current == null) {
                        parent.right = n;
                        break;
                    }
                }
            }
        }
    }

    遍历二叉树

    遍历二叉树有三种方式:中序、先序和后序。

    中序遍历按照节点上的键值,以升序访问BT 上的所有节点。先序遍历先访问根节点,然后以同样方式访问左子树和右子树。后序遍历先访问叶子节点,从左子树到右子树,再到根节点。

    中序

    采用递归,实现代码如下:

    function inOrder(node) {
        if (!(node == null)) {
            inOrder(node.left);
            console.log(node.show() + " ");
            inOrder(node.right);
        }
    }

    测试代码:

    var nums = new BT();
    nums.insert(56);
    nums.insert(22);
    nums.insert(81);
    nums.insert(10);
    nums.insert(30);
    nums.insert(77);
    nums.insert(92);
    
    inOrder(nums.root);

    下图展示了inOrder() 方法的访问路径。

    先序

    function preOrder(node) {
        if (!(node == null)) {
            console.log(node.show() + " ");
            preOrder(node.left);
            preOrder(node.right);
        }
    }

    注意inOrder() 和preOrder() 方法的唯一区别,就是if 语句中代码的顺序。在inOrder()方法中,show() 函数像三明治一样夹在两个递归调用之间;在preOrder() 方法中,show()函数放在两个递归调用之前。

    下图展示了preOrder() 方法的访问路径。

    后序

    function postOrder(node) {
        if (!(node == null)) {
            postOrder(node.left);
            postOrder(node.right);
            console.log(node.show() + " ");
        }
    }

    下图展示了postOrder() 方法的访问路径。

  • 相关阅读:
    Docker运行python容器
    SharePoint Online 创建门户网站系列之定制栏目
    SharePoint Online 创建门户网站系列之创建栏目
    SharePoint Online 创建门户网站系列之图片滚动
    SharePoint Online 创建门户网站系列之导航
    SharePoint Online 创建门户网站系列之首页布局
    SharePoint Online 创建门户网站系列之母版页
    SharePoint Online 创建门户网站系列之准备篇
    SharePoint 2013 数据库中手动更新用户信息
    SharePoint 2013 新建项目字段自动加载上次保存值
  • 原文地址:https://www.cnblogs.com/showtime813/p/6097727.html
Copyright © 2020-2023  润新知