1. 程式人生 > >劍指offer--面試題27:二叉搜尋樹與雙向連結串列--Java實現

劍指offer--面試題27:二叉搜尋樹與雙向連結串列--Java實現

題目描述:

輸入一顆二叉搜尋樹,將二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路:

原先指向左子結點的指標調整為連結串列中指向前一個結點的指標,原先指向右子結點的指標指向為連結串列中指向後一個結點的指標。

由於要求轉換後是排好序的連結串列,所以應該採用中序遍歷的方法。
當遍歷到根節點的時候,我們把樹看成三部分
值為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,不知道問題在哪,理論上是傳遞的引用應該沒有問題。這個後面在解決。