20.5.4
將 二叉搜尋樹 轉換成乙個 「排序的迴圈雙向鍊錶」 ,其中包含三個要素:
排序鍊錶: 節點應從小到大排序,因此應使用中序遍歷「從小到大」訪問樹的節點;
雙向鍊錶: 在構建相鄰節點(設前驅節點 pre ,當前節點 cur )關係時,不僅應 pre.right = cur,也應 cur.left = pre;
迴圈鍊錶: 設煉表頭節點 head 和尾節點 tail ,則應構建 head.left = tail 和 tail.right = head。
class solution
void inorder(node* root)
};
這道題看完書上的思路之後,自己嘗試寫了一下,執行結果:程式使用了超過限制的記憶體
然後自己以一顆3層的完全二叉樹為例來分析執行流程,發現果然是不對的:左子樹的根節點和右子樹的根節點在變換後是不會和整個樹的根節點相鄰的,而下面的程式中卻是相鄰的,明顯不對;
class solution
return presult;
}void converteachnode(treenode* prootoftree)
}};
看了書上的**,基本上是照著寫了一遍:
對於plastnode為什麼要把引用傳進去:
1、因為要改變的是plastnode指標本身(也就是讓它指向下乙個節點),而不是改變plastnode指標指向的節點。
2、因為plastnode是在convert裡面建立的變數,要在呼叫函式裡面使用它,就要傳遞引用。也可以在類中宣告為成員變數,就可以不加引用了。
普通傳參遞迴層數高的不會傳給層數低,這個引用可以讓遞迴層數高的改變的pre作用到層數低的函式中。
解釋:在第一次遞迴到底,函式返回之前,plastnode被更新為pcurr,也就是指向二叉樹最左的葉子節點的指標,不再是null,但是函式返回到上一層函式之後,上一層函式呼叫時傳入的引數plastnode並沒有被改變,依然是null。
因此,需要用&
另外,不用指標用引用的原因是:
class solution
return presult;
}void converteachnode(treenode* prootoftree, treenode** plastnode)
}};
《劍指offer》 36二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 public class treenode public class solution 右子樹轉換後,返回頭結點,連線在根節點右側 treenode rightnode conve...
劍指offer 36 二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。為了讓您更好地理解問題,以下面的二叉搜尋樹為例 我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,...
劍指 Offer 36 二叉搜尋樹與雙向鍊錶
劍指 offer 36.二叉搜尋樹與雙向鍊錶 力扣 leetcode 與leetcode 426相同。題意就是將二叉樹中的left,right指標改為雙向鍊錶中的前驅,後繼指標。既然是二叉搜尋樹,雙向鍊錶又要求順序,那肯定就是使用中序遍歷了,遍歷的過程中一邊遍歷一邊調整指標指向,最後將頭尾相連即可。...