[二叉树]二叉搜索树转换为双向链表(剑指Offer26)
生活随笔
收集整理的這篇文章主要介紹了
[二叉树]二叉搜索树转换为双向链表(剑指Offer26)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【試題描述】 將二叉搜索樹轉換為雙向鏈表
對于二叉搜索樹,可以將其轉換為雙向鏈表,其中,節點的左子樹指針在鏈表中指向前一個節點,右子樹指針在鏈表中指向后一個節點。
思路一:
采用遞歸思想,對于二叉搜索樹,將左、右子樹分別轉換為雙向鏈表,左子樹轉換所得鏈表的頭結點即整個樹的頭結點,左子樹轉換所得鏈表的尾節點與根節點相鄰;右子樹轉換所得鏈表的尾節點即整個樹的尾節點,右子樹轉換所得鏈表的頭結點與根節點相鄰。
1 private static Node last;2 public static Node treeToList(Node tree)3 {4 Node head;5 // 若樹為空,返回空6 if (tree == null)7 return null;8 9 // 若無左子樹,則該根節點為鏈表的頭結點 10 if (tree.left == null) 11 head = tree; 12 // 若有左子樹,遞歸調用轉換函數將左子樹轉換為雙向鏈表 13 // 左子樹轉換所得鏈表的頭結點是整個樹的頭結點 14 // 左子樹鏈表的尾結點與根節點相鄰 15 else 16 { 17 head = treeToList(tree.left); 18 tree.left = last; 19 last.right = tree; 20 } 21 //若無右子樹,則該根節點為鏈表的尾結點 22 if (tree.right == null) 23 last = tree; 24 //若有右子樹,遞歸調用轉換函數將右子樹轉換為雙向鏈表 25 //右子樹轉換所得鏈表的尾結點是整個樹的尾結點 26 //右子樹鏈表的頭結點與根節點相鄰 27 else 28 { 29 tree.right = treeToList(tree.right); 30 tree.right.left = tree; 31 } 32 return head; 33 34 }思路二:
我們可以中序遍歷整棵樹。按照這個方式遍歷樹,比較小的結點先訪問。如果我們每訪問一個結點,假設之前訪問過的結點已經調整成一個排序雙向鏈表,我們再把調整當前結點的指針將其鏈接到鏈表的末尾。當所有結點都訪問過之后,整棵樹也就轉換成一個排序雙向鏈表了。
思路
其實這段代碼也就5行,5行中2行是中序遍歷的代碼,分別是第8、16行;3行是更改節點指向的代碼,為13-15行。9-11行的if語句只有在中序遍歷到第一個節點時調用,自此之后listHead不變,listTail跟隨算法的進度。為了更清楚的展示,給出中序遍歷的代碼如下。對比可以看出來,實際上只是中序遍歷中的第八行代碼被上述的if-else語句替代了,僅此而已。
class Solution:def __init__(self):self.array = []def midOrder(self, root):if not root:return self.arrayself.midOrder(root.left)self.array.append(root.val)self.midOrder(root.right)?
?
?
?
總結
以上是生活随笔為你收集整理的[二叉树]二叉搜索树转换为双向链表(剑指Offer26)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌 CEO:Pixel 机型已在 17
- 下一篇: 【IT笔试面试题整理】给定一个数组a[N