劍指offer 二叉搜尋樹與雙向鍊錶

2022-05-24 16:57:12 字數 1636 閱讀 9510

這題做了好久,但是後面看來並不是想象中那麼難。

例如一棵樹

其實鍊錶的順序就是這棵樹中根遍歷的順序,所以我想到了用遞迴或者非遞迴。

非遞迴的做法就是用棧對這棵樹進行中根遍歷,

用棧進行中根遍歷的思路是,根節點的左子樹先入棧,然後出棧,棧頂元素的右孩子入棧,直到棧空為止。

構建雙鏈表時,記錄前乙個入棧的節點previous,當前出棧的節點current,然後把他們關聯起來。

public static treenode convert(treenode prootoftree) 

if(prootoftree.left==null&&prootoftree.right==null)

//建立乙個棧

linkedlist stack = new linkedlist();

treenode node =prootoftree;

//所有的左節點入棧

while(node!=null)

treenode prehead=new treenode(0);

treenode previous=prehead;

//當棧不為空時

while(!stack.isempty())

}//將之前出棧的點和現在出棧的點建立聯絡

previous.right=current;

current.left=previous;

previous=current;

}treenode newhead=prehead.right;

newhead.left=null;

return newhead;

}

遞迴做法我想了很久,因為總是想不到怎樣把之前遍歷過的記下來,劍指offer裡面的好像也不對。

思路:事實上根節點的left是指向左子樹的最後乙個節點,也就是最右邊的節點,根節點的right是指向右子樹最左邊的節點。

根據這個規律,可以遞迴實現。

public static treenode convert(treenode prootoftree)

if(prootoftree.left==null&&prootoftree.right==null)

//將左子樹構造成雙鏈表,並返回頭節點

treenode left=convert(prootoftree.left);

treenode p=left;

//將左子樹最後乙個節點獲取

while(p!=null&&p.right!=null)

if(p!=null)

//將右子樹構造成雙鏈表,並返回頭節點

treenode right=convert(prootoftree.right);

p=right;

//獲取右子樹的第乙個節點

while(p!=null&&p.left!=null)

//若p不為空,關聯prootoftree

if(p!=null)

//判斷left是否為空是為了避免沒有左子樹的情況

return left==null?prootoftree:left;

}

劍指offer 二叉搜尋樹與雙向連線

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。普通的二叉樹也可以轉換成雙向鍊錶,只不過不是排序的 思路 與中序遍歷相同 採用遞迴,先鏈結左指標,再鏈結右指標 1,更改doublelinkedlist,最後返回list的第乙...

《劍指offer》 二叉搜尋樹與雙向鍊錶

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解法 主要應用到二叉樹的中序遍歷。將左子樹遍歷進行不斷壓棧,然後再出棧。用兩個指標,current指向當前的樹的節點,pre指向前乙個節點,然後進行改指標引用,把壓棧的節點進行...

《劍指offer》二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向 輸入一棵二叉搜尋樹 將該二叉搜尋樹轉換成乙個排序的雙向鍊錶 struct treenode class solution 按照中序遍歷,按照左子樹 根節點 右子樹的順序。include ...