輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
1、乙個小點,二叉搜尋樹即為二叉排序樹,中序遍歷的結果為乙個遞增的陣列,因此這個題首先基本思路是進行二叉樹的中序遍歷。
//二叉樹中序遍歷遞迴的**如下:
void
midorder
(treenode* prootoftree)
midorder
(prootoftree-
>left)
; cout<>val;
midorder
(prootoftree-
>right)
;}
2、因為不能建立新的節點,只能改變原結點的指標,因此可以在中序遍歷中多新增乙個pre指標,用來儲存上乙個遍歷的節點,該節點即為當前節點的left,本來我想的是在midorder函式中新增乙個引數pre的,但是在執行時發現出現了錯誤,仔細分析後發現,如果將pre設為函式的引數,則只有在二叉樹的所有右分支中pre的值才會改變,因此pre應該設定為全域性變數,在每一次呼叫midorder函式時該變數的值都應該根據實際情況改變。
該題**如下:
/*
struct treenode
};*/
class
solution
void
midorder
(treenode* prootoftree)
midorder
(prootoftree-
>left)
; pre-
>right=prootoftree;
prootoftree-
>left=pre;
pre=prootoftree;
midorder
(prootoftree-
>right);}
};
劍指Offer 樹 二叉樹與雙向鍊錶
要把一棵二叉樹轉變成雙向鍊錶,二叉樹和雙向鍊錶很類似,每個節點都是包括乙個值和兩個指標。針對這題,思路還是遞迴,選擇的是樹的中序遍歷,中序遍歷是按照從小到大的順序遍歷二叉搜尋樹的每乙個節點,得出來的序列是有序的,注意只有二叉搜尋樹才有這個特性。這道題最重要的過程在於調整原來樹節點的指標,使得當前節點...
劍指offer題解(二叉樹與雙向鍊錶)
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。中序遍歷搜尋二叉樹,用pre儲存中序遍歷的前乙個節點,cur為當前節點,然後使pre right cur,cur left pre 注意pre要宣告為常指標,初始時pre為空 最後從根節...
劍指offer 二叉樹 二叉搜尋樹與雙向鍊錶
題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。這道題太難了,我不會做t t,直接引入參 吧。coding utf 8 class treenode def init self,x self.val x self.left ...