实现二叉树以及遍历二叉树
實(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)題。
- 上一篇: 丰田新任 CEO 佐藤浩司:将专注于雷克
- 下一篇: java五子棋代码详解_代码详解:Jav