在面試過程中經常會出現二叉排序樹轉換成雙向鍊錶的問題
思路:在二叉樹的學習中,我會發現,基本所有的問題都可以用樹的先序遍歷、中序遍歷、後序遍歷解決,所以我們可以使用這個思路來解決。
在此問題中,使用的是:後序遍歷。
/*
* 將二叉樹轉換成雙向鍊錶:直接在樹上改動(後序遍歷)
*/public node change_linkedlist(node head)
//採用後序遍歷的思想
node left=change_linkedlist(head.left);
node right=change_linkedlist(head.right);
//首先找到以head為根的左子樹的最右節點(左子樹的最大值)
while(left!=null&&left.right!=null)
//找到以head為根的右子樹的最左節點
while(right!=null&&right.left!=null)
//排除特殊情況:若左子樹一開始就是空的話(右子樹一開始就是空)
if(left!=null)
if(right!=null)
return head;
}
最後返回的結果是根節點的head;
所以要獲得頭結點就必須向前遍歷:
public
static
void
main(string args)
else
while(node!=null)
}}
最近自己複習寫了一種比較好理解的**
//二叉樹轉換成雙向鍊錶
public
void
inverttolinkedlist(node head )
//雙鏈表的連線
left.right=head;
head.left=left;
}if(head.right!=null)
//雙鏈表的連線
right.left=head;
head.right=right;
}}
二叉搜尋樹轉換成雙向鍊錶
問 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。public class treenode public class solution 如果已經遍歷到葉子節點,則將最後的節點轉變成葉子節點 if prootoftree.left ...
將二叉樹轉換成雙向鍊錶
思路 採用中序遍歷的方法,visit函式須要完畢的功能為 1 當前節點的左子節點指向上一次訪問的節點 2 將上一次訪問節點的右子節點指向當前節點 3 最後更新上一次訪問節點為當前節點。在第二步時須要推斷上一次訪問節點是不是為null,假設是,則第二步改為鍊錶的頭結點指向當前節點。程式例如以下 str...
鍊錶 將二叉搜尋樹轉換成雙向鍊錶
一 使用佇列 t o n s o n 按照二叉樹中序遍歷的順序,將每個節點放在佇列中 從佇列中依次彈出節點,並按照彈出的順序依次連線節點 public static node convert node root node head q.poll node pre head node cur null...