鏈表問題15——將搜索二叉樹轉換成雙向鏈表(方法二)

題目

題目同上一篇文章,即題目將二叉樹按照中序順序轉換成雙向鏈表


思路

方法二:利用遞歸函數,不使用任何容器。時間複雜度爲O(N),額外空間複雜度爲O(h),h爲二d d d df叉樹的高度

  1. 首先需要一個新的類,來返回有序雙向鏈表的頭節點和尾節點,ReturnTpye類
  2. 先將以X爲頭節點的左子樹轉換爲有序雙向鏈表,再將X的右子樹轉換爲有序雙向鏈表,通過X把兩部分連接即可
  3. 具體實現看下面的代碼部分

源碼 

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)的遍歷實現呢?也就是既不用棧,也不用遞歸函數,只用幾個變量?有的,後續在二叉樹的部分,還會結合神級的遍歷方法('遍歷二叉樹的神級方法')重新實現這一道題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章