实现二叉树以及遍历二叉树
生活随笔
收集整理的這篇文章主要介紹了
实现二叉树以及遍历二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實現二叉樹
定義節點:
//定義節點
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() 方法的訪問路徑。
總結
以上是生活随笔為你收集整理的实现二叉树以及遍历二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 丰田新任 CEO 佐藤浩司:将专注于雷克
- 下一篇: 三星手机官方固件下载