js(es6)實現二叉樹的插入、前序遍歷、中序遍歷、後序遍歷
阿新 • • 發佈:2021-01-27
導航:js(es6)實現單向連結串列——連結串列新增、刪除、反轉方法的實現.
基礎
1、在二叉樹的遍歷中,前中後是指父節點遍歷的順序
2、三個遍歷中,左子樹永遠比右子樹先遍歷
- 前序遍歷:根左右
- 中序遍歷:左根右
- 後序遍歷:左右中
舉例說明
-
前序遍歷:ABDC
-
中序遍歷:DBAC
-
後序遍歷:DBCA
ES6 程式碼實現
節點類
一個節點有左右指標和自身的value三個屬性
class Node{
constructor (data){
this.left = null
this.right = null
this .value = data
}
}
樹類
class Tree{
constructor (){
this.root = null
}
}
插入節點方法
這裡構建的是二叉搜尋樹,即父節點的值大於左節點的值,小於右節點的值
以下insertByFather方法會判斷新節點要插入到二叉搜尋樹的哪個位置,insert方法用來建立節點並呼叫insertByFather方法。
//根據給出的父節點,判斷將新節點插在其左還是其右
insertByFather(node, newNode) {
//如果新節點value小於父節點value,則插入父節點左子樹上,否則插入右子樹上
if(newNode.value < node.value){
//如果父左子樹存在,則遞迴判斷插入,否則新節點就是父左子節點
if(node.left){
insertNode(node.left, newNode)
}else{
node.left = newNode
}
}else{
if(node.right){
insertNode(node.right, newNode)
}else{
node. right = newNode
}
}
}
//插入節點方法
insert(value){
let node = new Node(value)
if(this.root){
insertNode(this.root, node)
}else{
this.root = node
}
}
前序遍歷
節點若存在,先列印該節點value,然後遞迴呼叫左子樹,最後遞迴呼叫右子樹
preOrder(node){
if(node){
console.log(node.value)
this.preOrder(node.left)
this.preOrder(node.right)
}
}
中序遍歷
節點若存在,先遞迴呼叫左子樹,然後列印該節點value,最後遞迴呼叫右子樹
inOrder(node){
if(node){
this.midOrder(node.left)
console.log(node.value)
this.midOrder(node.right)
}
}
後序遍歷
節點若存在,先遞迴呼叫左子樹,然後遞迴呼叫右子樹,最後列印該節點value
postOrder(node){
if(node){
this.postOrder(node.left)
this.postOrder(node.right)
console.log(node.value)
}
}
完整程式碼
class Node{
constructor (data){
this.left = null
this.right = null
this.value = data
}
}
class Tree{
constructor (){
this.root = null
}
//根據給出的父節點,判斷將新節點插在其左還是其右
insertByFather(node, newNode) {
if(newNode.value < node.value){
if(node.left){
insertNode(node.left, newNode)
}else{
node.left = newNode
}
}else{
if(node.right){
insertNode(node.right, newNode)
}else{
node.right = newNode
}
}
}
//建立並插入節點
insert(value){
let node = new Node(value)
if(this.root){
insertNode(this.root, node)
}else{
this.root = node
}
}
//前序遍歷
preOrder(node){
if(node){
console.log(node.valu)
this.preOrder(node.left)
this.preOrder(node.right)
}
}
//中序遍歷
inOrder(node){
if(node){
this.midOrder(node.left)
console.log(node.value)
this.midOrder(node.right)
}
}
//後序遍歷
postOrder(node){
if(node){
this.postOrder(node.left)
this.postOrder(node.right)
console.log(node.value)
}
}
}