二叉樹的順序存儲結構
二叉樹的順序存儲結構就是用一維數組存儲二叉樹中的各個結點,並且結點的存儲位置能體現結點之間的邏輯關系。
二叉樹的遍歷
二叉樹的遍歷有三種方式,如下:
(1)先序遍歷(DLR),首先訪問根結點,然后遍歷左子樹,最后遍歷右子樹。簡記根-左-右。
(2)中序遍歷(LDR),首先遍歷左子樹,然后訪問根結點,最后遍歷右子樹。簡記左-根-右。
(3)后序遍歷(LRD),首先遍歷左子樹,然后遍歷右子樹,最后訪問根結點。簡記左-右-根。
假設dom結構如下:
<div id="tree"> <div> <div> <div></div> <div></div> </div> <div> <div></div> <div></div> </div> </div> <div> <div> <div></div> <div></div> </div> <div> <div></div> <div></div> </div> </div> </div>
遍歷方式:
var arr = []; // 遞歸先序遍歷 function recurDLR(node) { if (!node) { return; } arr.push(node); recurDLR(node.firstElementChild); recurDLR(node.lastElementChild); } // 遞歸中序遍歷 function recurLDR(node) { if (!node) { return; } recurLDR(node.firstElementChild); arr.push(node); recurLDR(node.lastElementChild); } // 遞歸后序遍歷 function recurLRD(node) { if (!node) { return; } recurLRD(node.firstElementChild); recurLRD(node.lastElementChild); arr.push(node); }
多叉樹結構遍歷
// 遞歸先序遍歷 先遍歷子節點 再遍歷根節點 function recurDLR(node) { if (!node) { return; } arr.push(node); for (let i = 0; i < node.children.length; i++) { if (node.children[i].nodeName.toLowerCase() === 'div') { recurDLR(node.children[i]); } } } // 遞歸后序遍歷 先遍歷根節點 再遍歷子節點 function recurLRD(node) { if (!node) { return; } for (let i = 0; i < node.children.length; i++) { if (node.children[i].nodeName.toLowerCase() === 'div') { recurLRD(node.children[i]); } } arr.push(node); } // 層序遍歷 從根節點一層一層向下遍歷 // 原理就是利用數組的后進先出 存儲dom節點 function recurLDR(node) { var stack = []; stack.push(node); var del = stack.shift(); while (del) { for (let i = 0; i < del.children.length; i++) { if (del.children[i].nodeName.toLowerCase() === 'div') { stack.push(del.children[i]); } } arr.push(del); del = stack.shift(); } }