將搜尋二叉樹轉換成雙向鍊錶

2022-09-10 09:30:14 字數 2228 閱讀 6548

題目:將搜尋二叉樹轉換成雙向鍊錶

《程式設計師**面試指南》第26題 p81 難度:尉

★★☆☆

頭一回做二叉樹的題,著實有點艱難。首先就倒在了牛客上面生成二叉樹的問題。

題目給的示例輸入是這樣子的:

9

6 4 7

4 2 5

2 1 3

5 0 0

1 0 0

3 0 0

7 0 9

9 8 0

8 0 0

如果按照遞迴的方式生成二叉樹,直接就撲街了。。

2 1 3的下一行不是1 0 0 ,而是5 0 0。輸入一開始按照往左子樹不斷深入的方式(6 4 7->4 2 5->2 1 3),結果中途又變卦了。

所以要想成功生成此二叉樹,只能用hashmap了,將已有的節點存入hashmap,再獲取出來進行連線。

該題討論中有個不錯的**,如下:

public static treenode treegenerator(int count, string numbers) 

}treenode cur;

for (int i = 0; i < count; i++)

return map.get(integer.parseint(numbers[0][0]));

}

然後回歸到題目,本題也是分為兩種方法,額外空間複雜度分別為o(n)o(h)(h為二叉樹的高度)。

第一種方法很容易理解,用佇列等容器收集二叉樹中序遍歷結果,然後再依次彈出節點進行連線。(前中後序遍歷待刷到二叉樹大類題再進一步鞏固一下)

**如下:

public node convert1(node head) 

head = queue.poll();

node pre = head;

pre.left = null;

node cur = null;

while (!queue.isempty())

pre.right = null;

return head;

}public void inordertoqueue(node head, queuequeue)

inordertoqueue(head.left, queue);

queue.offer(head);

inordertoqueue(head.right, queue);

}

第二種方法利用遞迴函式,書上解釋看半天才大概看懂。

核心思路是先後將x節點左、右子樹轉換為有序雙向鍊錶然後與x節點進行連線

需要額外注意一下,轉換為有序雙向鍊錶後需要同時返回其頭和尾節點,以便進行連線,所以需要定義一種複雜結構的返回值型別,如下:

public class retruntype 

}

結合遞迴的思想,通過這種方式就可以最終將整個二叉樹轉換為有序雙向鍊錶,具體**如下:

public node convert2(node head) 

return process(head).start;

}public retruntype process(node head)

retruntype leftlist = process(head.left);

retruntype rightlist = process(head.right);

if (leftlist.end != null)

head.left = leftlist.end;

head.right = rightlist.start;

if (rightlist.start != null)

return new retruntype(leftlist.start != null ? leftlist.start : head,

rightlist.end != null ? rightlist.end : head);

}

將搜尋二叉樹轉換成雙向鍊錶

對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標 對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。用兩種方法求解本題。方法一 由於是搜尋二叉樹,直接求出其中序遍歷序列,構造雙向鍊...

將搜尋二叉樹轉換成雙向鍊錶

題目 對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標 對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。public class convertdn public static ...

將二叉樹轉換成雙向鍊錶

思路 採用中序遍歷的方法,visit函式須要完畢的功能為 1 當前節點的左子節點指向上一次訪問的節點 2 將上一次訪問節點的右子節點指向當前節點 3 最後更新上一次訪問節點為當前節點。在第二步時須要推斷上一次訪問節點是不是為null,假設是,則第二步改為鍊錶的頭結點指向當前節點。程式例如以下 str...