題目
題目同上一篇文章,即題目將二叉樹按照中序順序轉換成雙向鏈表
思路
方法二:利用遞歸函數,不使用任何容器。時間複雜度爲O(N),額外空間複雜度爲O(h),h爲二d d d df叉樹的高度
- 首先需要一個新的類,來返回有序雙向鏈表的頭節點和尾節點,ReturnTpye類
- 先將以X爲頭節點的左子樹轉換爲有序雙向鏈表,再將X的右子樹轉換爲有序雙向鏈表,通過X把兩部分連接即可
- 具體實現看下面的代碼部分
源碼
public class ReturnType{
public Node start;
public Node end;
public ReturnType(Node start, Node end){
this.start=start;
this.end=end;
}
}
public Node convert2(Node head){
if(head==null){
return null;
}
return process(head).start;
}
public ReturnType process(Node head){
if(head==null){
return new ReturnType(null,null);
}
ReturnType leftList=process(head.left);
ReturnType rightList=process(head.right);
if(leftList.end!=null){
leftList.end.right=head;
}
head.left=leftList.end;
head.right=rightList.start;
if(rightList.start!=null){
rightList.start.left=head;
}
return new ReturnType(leftList.start!=null?leftList.start:head,
rightList.end!=null?rightList.end:head);
}
解析
時間複雜度可以用process遞歸函數發生的次數來估算,process會處理所有子樹,子樹的數量就是二叉樹節點的數量。所以時間複雜度爲O(N),process遞歸函數最多會佔用二叉樹高度爲h的棧空間,額外的空間複雜度也就是O(h)了。
擴展
本題在複雜度方面完全取決於二叉樹的遍歷的實現。有沒有時間複雜度爲O(N),額外空間複雜度爲O(1)的遍歷實現呢?也就是既不用棧,也不用遞歸函數,只用幾個變量?有的,後續在二叉樹的部分,還會結合神級的遍歷方法('遍歷二叉樹的神級方法')重新實現這一道題。