摘要:一個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)二叉樹二叉樹是一種特殊的樹,子節(jié)點(diǎn)數(shù)不超過個(gè)。以某種特定的順序訪問樹中所有的節(jié)點(diǎn)稱為樹的遍歷樹的層數(shù)稱為樹的深度一個(gè)父節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)分別稱為左節(jié)點(diǎn)和右節(jié)點(diǎn)二叉查找樹又稱二叉排序樹是一種特殊的二叉樹。
原文地址:http://www.brandhuang.com/article/1564967352592
1、樹一棵樹最上面的節(jié)點(diǎn):根結(jié)點(diǎn)
一個(gè)節(jié)點(diǎn)下面連接多個(gè)節(jié)點(diǎn),那個(gè)這個(gè)節(jié)點(diǎn)稱「為父節(jié)點(diǎn)」,它下面的節(jié)點(diǎn)稱為「子節(jié)點(diǎn)」,沒有任何子節(jié)點(diǎn)的節(jié)點(diǎn)稱為「葉子節(jié)點(diǎn)」。
一個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)
2、二叉樹二叉樹是一種特殊的樹,子節(jié)點(diǎn)數(shù)不超過「2個(gè)」。
以某種特定的順序訪問樹中所有的節(jié)點(diǎn)稱為樹的遍歷
樹的層數(shù)稱為「樹的深度」
一個(gè)父節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)分別稱為「左節(jié)點(diǎn)」和「右節(jié)點(diǎn)」
「二叉查找樹」(又稱二叉排序樹)是一種特殊的二叉樹。++相對(duì)較小的值保存在左節(jié)點(diǎn)中,相對(duì)較大的值保存在右節(jié)點(diǎn)中++
3、js構(gòu)建以一顆二叉樹用代碼構(gòu)建二叉樹前,先要在腦中不斷的重復(fù)二叉樹的重要特點(diǎn):
二叉樹有一個(gè)父節(jié)點(diǎn)和左右兩個(gè)子節(jié)點(diǎn);
每個(gè)節(jié)點(diǎn)有一個(gè)值,稱為節(jié)點(diǎn)值;
左節(jié)點(diǎn)的值小于父節(jié)點(diǎn)的值,右節(jié)點(diǎn)的值大于父節(jié)點(diǎn)值。
明白了這三點(diǎn),我們就可以開始寫代碼了
構(gòu)建二叉樹的完整代碼請(qǐng)看文末
3.1 創(chuàng)建一個(gè)二叉樹對(duì)象創(chuàng)建一個(gè)二叉樹對(duì)象,定義一個(gè)對(duì)象來保存節(jié)點(diǎn)的值和其子節(jié)點(diǎn)
function binaryTree(){ let Node = function (key){ this.key = key // 節(jié)點(diǎn)值 this.left = null // 該節(jié)點(diǎn)的左節(jié)點(diǎn) this.right = null // 該節(jié)點(diǎn)的右節(jié)點(diǎn) } let root = null // 根結(jié)點(diǎn),初始值為null }3.2 創(chuàng)建一個(gè)構(gòu)建二叉樹的函數(shù)
在binaryTree中創(chuàng)建一個(gè)insert方法,通過insert方法向樹中添加新節(jié)點(diǎn)
function binaryTree(){ let Node = function (key){ this.key = key // 節(jié)點(diǎn)值 this.left = null // 該節(jié)點(diǎn)的左節(jié)點(diǎn) this.right = null // 該節(jié)點(diǎn)的右節(jié)點(diǎn) } let root = null // 根結(jié)點(diǎn),初始值為null let insertNode = function(node, newNode){ if (newNode.key < node.key) { // 如果新節(jié)點(diǎn)的key值小于原來節(jié)點(diǎn)的key值,則該新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn)加入 if (node.left) { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)已經(jīng)存在,則繼續(xù)執(zhí)行insertNode方法 insertNode(node.left, newNode) } else { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)不存在,則將新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn) node.left = newNode } } else { // 如果新節(jié)點(diǎn)的key值大于原來節(jié)點(diǎn)的key值,則作為原節(jié)點(diǎn)的右節(jié)點(diǎn)加入 if (node.right) { insertNode(node.right, newNode) } else { node.right = newNode } } } this.insert = function(key){ let newNode = new Node(key) // 插入節(jié)點(diǎn)時(shí)創(chuàng)建一個(gè)Node對(duì)象來保存節(jié)點(diǎn)的數(shù)據(jù) if (root) { insertNode(root, newNode) // 如果根結(jié)點(diǎn)已經(jīng)存在,則通過insertNode方法進(jìn)行插入 } else { root = newNode // 如果根結(jié)點(diǎn)為空,則把該節(jié)點(diǎn)作為根結(jié)點(diǎn) } } }3.3 構(gòu)建一個(gè)二叉樹
let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13] let tree = new binaryTree() nodes.forEach(function (key) { tree.insert(key) })
至此,一個(gè)二叉樹構(gòu)建完畢
其實(shí),只要你了解了二叉樹的三個(gè)重要特點(diǎn),構(gòu)建一棵二叉樹是不是還是比較容易的呢?
可以將代碼復(fù)制到自己的文件中進(jìn)行單步調(diào)試,看看執(zhí)行的結(jié)果是不是和前面描述的二叉樹的特點(diǎn)相同。
感謝你的閱讀
完整代碼:
function binaryTree(){ let Node = function (key){ this.key = key // 節(jié)點(diǎn)值 this.left = null // 該節(jié)點(diǎn)的左節(jié)點(diǎn) this.right = null // 該節(jié)點(diǎn)的右節(jié)點(diǎn) } let root = null // 根結(jié)點(diǎn),初始值為null let insertNode = function(node, newNode){ if (newNode.key < node.key) { // 如果新節(jié)點(diǎn)的key值小于原來節(jié)點(diǎn)的key值,則該新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn)加入 if (node.left) { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)已經(jīng)存在,則繼續(xù)執(zhí)行insertNode方法 insertNode(node.left, newNode) } else { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)不存在,則將新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn) node.left = newNode } } else { // 如果新節(jié)點(diǎn)的key值大于原來節(jié)點(diǎn)的key值,則作為原節(jié)點(diǎn)的右節(jié)點(diǎn)加入 if (node.right) { insertNode(node.right, newNode) } else { node.right = newNode } } } this.insert = function(key){ let newNode = new Node(key) // 插入節(jié)點(diǎn)時(shí)創(chuàng)建一個(gè)Node對(duì)象來保存節(jié)點(diǎn)的數(shù)據(jù) if (root) { insertNode(root, newNode) // 如果根結(jié)點(diǎn)已經(jīng)存在,則通過insertNode方法進(jìn)行插入 } else { root = newNode // 如果根結(jié)點(diǎn)為空,則把該節(jié)點(diǎn)作為根結(jié)點(diǎn) } } } let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13] let tree = new binaryTree() nodes.forEach(function (key) { tree.insert(key) })
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106375.html
摘要:因此,根據(jù)題目給出的先序遍歷和中序遍歷,可以畫出二叉樹選參考數(shù)據(jù)結(jié)構(gòu)與算法描述實(shí)現(xiàn)二叉樹算法淺談數(shù)據(jù)結(jié)構(gòu)二叉樹慕課網(wǎng)實(shí)現(xiàn)二叉樹算法前端樹控件騰訊軟件開發(fā)面試題 內(nèi)容銜接上一章 數(shù)據(jù)結(jié)構(gòu)與算法:常見排序算法 內(nèi)容提要 什么是樹 - 為什么使用樹 二叉樹 二叉查找樹 紅黑樹 B、B+樹 堆 伸展樹 樹 可以點(diǎn)擊鏈接感受下筆者用d3.js畫的tree https://codepen...
摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。非線性表中的樹堆是干嘛用的其數(shù)據(jù)結(jié)構(gòu)是怎樣的希望大家?guī)е@兩個(gè)問題閱讀下文。其中,前中后序,表示的是節(jié)點(diǎn)與它的左右子樹節(jié)點(diǎn)遍歷訪問的先后順序。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,...
摘要:像剛才的這幅圖,就是二叉搜索樹。而我們本文要學(xué)習(xí)的內(nèi)容,就是如何寫一個(gè)二叉搜索樹。但在二叉搜索樹中,我們把節(jié)點(diǎn)成為鍵,這是術(shù)語。前端路漫漫,且行且歌的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法四二叉搜索樹 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)...
摘要:二叉搜索樹的特性二叉搜索樹由于其獨(dú)特的數(shù)據(jù)結(jié)構(gòu),使得其無論在增刪,還是查找,時(shí)間復(fù)雜度都是,為二叉樹的高度。二叉搜索樹的查找查找很簡(jiǎn)單,根據(jù)左子節(jié)點(diǎn)比該節(jié)點(diǎn)小,右子節(jié)點(diǎn)比該節(jié)點(diǎn)大的原則進(jìn)行循環(huán)判斷即可。 什么是二叉樹 二叉樹就是樹的每個(gè)節(jié)點(diǎn)最多只能有兩個(gè)子節(jié)點(diǎn) 什么是二叉搜索樹 二叉搜索樹在二叉樹的基礎(chǔ)上,多了一個(gè)條件,就是二叉樹在插入值時(shí),若插入值比當(dāng)前節(jié)點(diǎn)小,就插入到左節(jié)點(diǎn),否則插...
摘要:重建二叉樹輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。所以先通過前序遍歷找出根節(jié)點(diǎn),然后將中序遍歷分為左右子樹兩組,最后對(duì)于每個(gè)子樹依次遞歸調(diào)用。 重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}...
閱讀 1863·2021-11-25 09:43
閱讀 1504·2021-09-02 15:21
閱讀 3472·2019-08-30 15:52
閱讀 1511·2019-08-30 12:48
閱讀 1308·2019-08-30 10:57
閱讀 2939·2019-08-26 17:41
閱讀 688·2019-08-26 11:59
閱讀 1379·2019-08-26 10:41