日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

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

發(fā)布時(shí)間:2023/12/15 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 实现二叉树以及遍历二叉树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)現(xiàn)二叉樹(shù)

定義節(jié)點(diǎn):

//定義節(jié)點(diǎn)
function Node(data, left, right) {
    this.data = data;
    this.left = left;
    this.right = right;
    this.show = show;
}
//顯示節(jié)點(diǎn)數(shù)據(jù)
function show() {
    return this.data;
}

實(shí)現(xiàn)二叉樹(shù)類(lèi)前,我們要先知道插入實(shí)現(xiàn)算法

查找正確插入點(diǎn)的算法如下。
(1) 設(shè)根節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)。
(2) 如果待插入節(jié)點(diǎn)保存的數(shù)據(jù)小于當(dāng)前節(jié)點(diǎn),則設(shè)新的當(dāng)前節(jié)點(diǎn)為原節(jié)點(diǎn)的左節(jié)點(diǎn);反之,執(zhí)行第4 步。
(3) 如果當(dāng)前節(jié)點(diǎn)的左節(jié)點(diǎn)為null,就將新的節(jié)點(diǎn)插入這個(gè)位置,退出循環(huán);反之,繼續(xù)執(zhí)行下一次循環(huán)。
(4) 設(shè)新的當(dāng)前節(jié)點(diǎn)為原節(jié)點(diǎn)的右節(jié)點(diǎn)。
(5) 如果當(dāng)前節(jié)點(diǎn)的右節(jié)點(diǎn)為null,就將新的節(jié)點(diǎn)插入這個(gè)位置,退出循環(huán);反之,繼續(xù)執(zhí)行下一次循環(huán)。

//定義二叉樹(shù)類(lèi)
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;
                }
            }
        }
    }
}

遍歷二叉樹(shù)

遍歷二叉樹(shù)有三種方式:中序、先序和后序。

中序遍歷按照節(jié)點(diǎn)上的鍵值,以升序訪問(wèn)BT 上的所有節(jié)點(diǎn)。先序遍歷先訪問(wèn)根節(jié)點(diǎn),然后以同樣方式訪問(wèn)左子樹(shù)和右子樹(shù)。后序遍歷先訪問(wèn)葉子節(jié)點(diǎn),從左子樹(shù)到右子樹(shù),再到根節(jié)點(diǎn)。

中序

采用遞歸,實(shí)現(xiàn)代碼如下:

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

測(cè)試代碼:

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() 方法的訪問(wèn)路徑。

先序

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

注意inOrder() 和preOrder() 方法的唯一區(qū)別,就是if 語(yǔ)句中代碼的順序。在inOrder()方法中,show() 函數(shù)像三明治一樣夾在兩個(gè)遞歸調(diào)用之間;在preOrder() 方法中,show()函數(shù)放在兩個(gè)遞歸調(diào)用之前。

下圖展示了preOrder() 方法的訪問(wèn)路徑。

后序

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

下圖展示了postOrder() 方法的訪問(wèn)路徑。

總結(jié)

以上是生活随笔為你收集整理的实现二叉树以及遍历二叉树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。