依然是注意不要陷入死迴圈;
***********************************===
判斷節點兒子的情況相對較為複雜:
首先,如果該節點有兩個兒子,那麼它的沒有線索指標。同樣,除了整棵線索樹只有乙個節點的情況(它沒有前繼與後繼),沒有線索指標就意味著有兩個兒子,那麼只需要新增一些其他條件就可以把只有乙個節點的特殊情況判斷出來,很顯然,當兩個指標都指向null時該節點就是單節點樹。
其它所有的情況都是少於兩個兒子的。
也可以反過來考慮,當有乙個兒子指標為null或者有乙個以上的線索指標,必然是少於兩個兒子的.
***********************************===
另乙個需要注意的地方是線索的處理,也許某個節點被刪除以後它的父節點有了乙個空指標,這個指標必須指向乙個線索.注意到
如果父節點是有兩個兒子的,我們選取它左子樹的最大節點進行遞迴刪除(像普通二叉樹),然後檢測該父節點的左兒子是否變成了null,如果是,就要找到這個相應的線索.
***********************************=
如果該父節點只有乙個兒子,那麼我們確定是哪個兒子(注意這裡要區分是兒子而不是線索),然後找到兒子的的前驅後驅代替該兒子,並且刪除該兒子。
******************************====
那麼父節點的兒子被刪除後是否會出現應該指向線索但卻指向null呢?如果兒子的前驅/後繼是null的話,就可能出現這種情況(因為代替兒子的是它的前驅後繼),那說明該兒子是最大節點或者最小節點,那麼兒子被刪除後相應的最大或最小節點一定是它們的父節點(根據中序遍歷很容易證明這一點),因此該父節點任然沒有前驅/後繼,不需要新增線索.
*************************====
[4]還需要注意的一點是,如果某節點被刪除後,是否會影響到某些線索指標指向它的節點?假設該節點y是具有兩個兒子的節點,那麼我們是將它左子樹的最大節點代替它,然後遞迴的刪除左子樹的最大節點的.很顯然,左子樹的最大節點就是它的前繼。因此原來節點x的後繼如果指向y那麼x就是它左子樹的最大節點,會被遞迴刪除掉,當然沒有線索.如果節點z的前繼線索指向y,那麼z就是y的後繼,一定是右子樹最小節點,
那麼z的線索將指向原來的x(xyz)在y被刪除後(xz),這個線索是正確的.
***********************************=
(3)通過詳細(也許囉嗦)的分類分析,按照該演算法線索既不會缺少,也不會指向錯誤.
position findmax(position t)//查詢該樹的最大值
position delete(position t,int x)
else/有兩個兒子 }
} return t;
}
STM32 REG的基本例程和燈 蜂鳴器實驗
後面的程式都基於這個平台建立,相當於底層驅動已做好,只需呼叫,使用的原子的stm32f4探索者,底層驅動已寫好,後續需對底層驅動挖掘。keil軟體也有介紹,學習了使用技巧,文字美化 語法檢測 提示 編輯技巧,和魔術棒的常規使用方法,基本 環境可完成搭建。startup stm32f40 41 s檔案...
GNU LD系列 3 3 簡單的鏈結指令碼例程
許多鏈結指令碼是相當簡單的。可能最簡單的鏈結指令碼只包含乙個命令 sections 我們使用 sections 命令來描述輸出檔案的記憶體布局。sections 命令是乙個很強大的命令。在這裡我們將描述乙個該命令的簡單應用。假設現在我們的程式裡僅僅由文字 初始化資料 未初始化資料組成。它們會相應地存...
樹的線索化
先看乙個問題 將數列 構建成一顆二叉樹.n 1 7 當我們對上面的二叉樹進行中序遍歷時,數列為 但是 6,8,10,14 這幾個節點的 左右指標,並沒有完全的利用上.如果我們希望充分的利用 各個節點的左右指標,讓各個節點可以指向自己的前後節點,怎麼辦?解決方案 線索二叉樹 n 個結點的二叉鍊錶中含有...