二叉樹與多叉樹的遍歷


二叉樹的順序存儲結構

二叉樹的順序存儲結構就是用一維數組存儲二叉樹中的各個結點,並且結點的存儲位置能體現結點之間的邏輯關系。

 

二叉樹的遍歷

二叉樹的遍歷有三種方式,如下:

(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();
    }        
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM