delete二叉樹根節點,會一次清空二叉樹占用的記憶體嗎?

時間 2021-06-02 08:12:42

1樓:一頁書

你需要自己實現析構函式。

// 假設你的節點定義是這樣

struct

TreeNode

;TreeNode

::~TreeNode

()if

(right

!=nullptr)}

2樓:魚你太美

上面幾樓的答案都是錯的。

其實這不就是乙個深度優先+後序遍歷訪問每乙個結點的過程嗎,只不過訪問結點的方式改成了delete而已。析構根結點的時候,遞迴析構左右兩個子節點,最後把根節點記憶體釋放掉(自動的)不就行了。

3樓:張強

但是不推薦這樣做,因為違背了程式設計的統

一、模組化的思想,為什麼在自身析構裡面還能影響其他資料?一般C++程式設計,都是在析構中只完成delete自己類中new出來的資料,而不應該對其他類或者外面new出的資料造成影響。這個節點的左右節點並不是該節點自己new出來的,而是在外部new出來的,就應該如上面說的,應該通過增加乙個普通函式,delete左右節點,再delete該節點。

試想如果乙個人死亡了,卻導致更多的人死亡,那這個程式設計思想本身就不合理。

4樓:

對 C++ 來說,資源申請和釋放必須一一對應,如果只考慮 new 和 delete,那麼乙個 new 必須對應乙個 delete,所以顯然是不能的。

乙個節點有三個值:

當前儲存的資料

代表左節點的指標

代表右節點的指標

當你析構它的時候,會釋放掉這三者,但是指標所指向的值並不會被釋放,指標只是一串無意義的數字,如果你不遞迴的釋放指標指向的位置,只刪掉這個指標,其效果跟隨便刪乙個無意義的數字是一樣的,那塊記憶體並不會發生改變。

所以我們有遞迴的或非遞迴的方法來析構一顆二叉樹,遞迴的比較好理解,當析構乙個節點時,先析構它的兩個葉;而非遞迴版本只是手工維護堆疊而已。

如何求二叉樹中某個指定節點的深度

刑事組之虎曹達華 遞迴求深度,傳入相應的節點即可 public static int treeDepth TreeNode root 計算左子樹的深度 int left treeDepth root.left 計算右子樹的深度 int right treeDepth root.right 樹root...

如何求二叉樹的直徑的路徑?

二叉樹擴充套件為樹 即樹的直徑 其實是很經典的演算法。常見有兩種寫法 1樹形dp 2貪心。列印路徑的話,與普通dp列印路徑一樣 我習慣是求出最優值再根據dp的決策遞迴列印 下面的截圖來自紫書p281。 rsa 二叉樹上每條路徑都可以分成兩段,前半段深度遞減,後半段深度遞增。於是我們可以列舉路徑上深度...

看見二叉樹的各種遞迴演算法就倒了怎麼辦?

維1111 自問自答 最近找到一本書,感覺讓我看懂了遞迴 1 對原問題f s 進行分析,假設出合理的 較小問題 與數學歸納法中的假設n k 1是等式成立相似 2 假設f s 是可解的,即給出f s 與f s 之間的關係 與數學歸納法中的求證n k時等式成立的過程相似 3 確定乙個特定情況 如f 0 ...