劍指offer--面試題27:二叉搜尋樹與雙向連結串列--Java實現
阿新 • • 發佈:2019-01-03
題目描述:
輸入一顆二叉搜尋樹,將二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
思路:
原先指向左子結點的指標調整為連結串列中指向前一個結點的指標,原先指向右子結點的指標指向為連結串列中指向後一個結點的指標。
由於要求轉換後是排好序的連結串列,所以應該採用中序遍歷的方法。
當遍歷到根節點的時候,我們把樹看成三部分
值為10的根結點,根結點值為6的左子樹,根結點值為14的右子樹。
我們需要把值為10的結點與左子樹中最大的結點8, 右子樹中最小的結點12連在一起。
程式碼
public class ConvertTest {
static class TreeNode{
int value;
TreeNode left;
TreeNode right;
public TreeNode(int v) {
this.value = v;
}
}
public static TreeNode convert(TreeNode root){
TreeNode lastNodeInList = null;
convertNode(root, lastNodeInList);
if (lastNodeInList == null){
System.out.println("lastNodeInList == null");
}
TreeNode listHead = lastNodeInList;
while(listHead != null && listHead.left != null){
listHead = listHead.left;
}
return listHead;
}
private static void convertNode(TreeNode node, TreeNode lastNodeInList) {
if(node == null){
return;
}
TreeNode currentNode = node;
if(currentNode.left != null){
convertNode(currentNode.left, lastNodeInList);
}
currentNode.left = lastNodeInList;
if(lastNodeInList != null){
lastNodeInList.right = currentNode;
}
lastNodeInList = currentNode;
if(lastNodeInList != null){
System.out.println("Set last = " + lastNodeInList.value);
}else{
System.out.println("Set last = null");
}
if(currentNode.right != null){
convertNode(currentNode.right, lastNodeInList);
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(10);
TreeNode node6 = new TreeNode(6);
TreeNode node14 = new TreeNode(14);
TreeNode node4 = new TreeNode(4);
TreeNode node8 = new TreeNode(8);
TreeNode node12 = new TreeNode(12);
TreeNode node16 = new TreeNode(16);
root.left = node6;
root.right = node14;
node6.left = node4;
node6.right = node8;
node14.left = node12;
node14.right = node16;
TreeNode head = convert(root);
if(head == null){
System.out.println("head == null");
}
TreeNode node = head;
while(node != null){
System.out.println(node.value);
node = node.right;
}
}
}
說明
上面這段程式碼是有問題的,最後lastNodeInList == null,不知道問題在哪,理論上是傳遞的引用應該沒有問題。這個後面在解決。