題目:將搜尋二叉樹轉換成雙向鍊錶
《程式設計師**面試指南》第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...