二叉搜索樹(shù)與雙向鏈表

題目描述:輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)點(diǎn),只能調(diào)整樹(shù)中結(jié)點(diǎn)指針的指向。

// 遞歸版
    function Convert(pRootOfTree) {
      // write code here
      if (pRootOfTree == null) { // 如果根結(jié)點(diǎn)為空
        return null;
      }
      if (pRootOfTree.left == null && pRootOfTree.right == null) {
        return pRootOfTree; // 如果只有根結(jié)點(diǎn)
      }
      var left = Convert(pRootOfTree.left); // 對(duì)左子樹(shù)遞歸,left指向左鏈表的頭結(jié)點(diǎn)
      var p = left; // 利用輔助結(jié)點(diǎn)p來(lái)尋找左鏈表的最后一個(gè)結(jié)點(diǎn)
      while (p != null && p.right != null) {
        p = p.right;
      }
      if (left != null) { // 如果左鏈表不為空,將其作為根結(jié)點(diǎn)的左子樹(shù)
        p.right = pRootOfTree;
        pRootOfTree.left = p;
      }
      var right = Convert(pRootOfTree.right); // 對(duì)右子樹(shù)進(jìn)行遞歸
      if (right != null) { // 如果右鏈表不為空,將其拼接到根結(jié)點(diǎn)的右結(jié)點(diǎn)上
        right.left = pRootOfTree;
        pRootOfTree.right = right;
      }
      return left == null ? pRootOfTree : left; // 返回左鏈表的頭結(jié)點(diǎn)或左鏈表為空時(shí)返回根結(jié)點(diǎn)
    }
// 非遞歸版
function Convert(pRootOfTree) {
      var stack = []; // 利用棧對(duì)樹(shù)中的每個(gè)結(jié)點(diǎn)進(jìn)行遍歷
      var isFirst = true; // 觸底反彈的條件
      var p = pRootOfTree; // 操作指針
      var root = null; // 新鏈表的頭結(jié)點(diǎn)
      var pre = null; // 操作指針
      if (!pRootOfTree) return null; // 如果樹(shù)為空
      while (p || stack.length) {
        while (p) {
          stack.push(p);
          p = p.left;
        }
        p = stack.pop();
        if (isFirst) { // 作用是將最左下結(jié)點(diǎn)返回給root,即遍歷后鏈表的第一個(gè)結(jié)點(diǎn)
          root = p;
          pre = root;
          isFirst = false; // isFlag使命完成,只使用一次,后續(xù)不再使用
        } else {
          p.left = pre;
          pre.right = p;
          pre = p;
        }
        p = p.right;
      }
      return root;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目描述 輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)點(diǎn),只能調(diào)整樹(shù)中結(jié)點(diǎn)指...
    繁著閱讀 1,436評(píng)論 0 1
  • 二叉搜索樹(shù)與雙向鏈表 題目描述 輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)...
    echoVic閱讀 800評(píng)論 0 3
  • 題目描述: 輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)點(diǎn),只能調(diào)整樹(shù)中結(jié)點(diǎn)...
    夏臻Rock閱讀 1,261評(píng)論 0 0
  • 題目描述輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)點(diǎn),只能調(diào)整樹(shù)中結(jié)點(diǎn)指針...
    哦漏昵稱(chēng)已被占用閱讀 254評(píng)論 0 0
  • 題目輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)點(diǎn),只能調(diào)整樹(shù)中結(jié)點(diǎn)指針的指...
    no_one11閱讀 324評(píng)論 0 0

友情鏈接更多精彩內(nèi)容