題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
題目分析
對於本題其實考察的是對於樹的遍歷,對於二叉搜尋樹,其性質之一是樹的根節點大於左子樹的節點而小於右子樹的節點,而題目想要我們將一顆二叉搜尋樹轉換成乙個有序的的雙向鍊錶。
由樹的遍歷性質,我們可以知道當樹進行中序遍歷的時候,我們得到的序列便是我們想要得到的有序的序列。
但是題目要求的是不借助其他節點或者容器,只能通過指標的方式進行修改,所以我們不能通過中序遍歷的方式將每乙個幾點讀進乙個容器裡,然後再修改容器中指標的方向。
思路
1.我們先要在方法之外定義乙個樹節點的指標(該指標的作用是指向鍊錶最後乙個節點)。
2.我們在函式裡判斷根節點是否為空,如果為空則返回空,如果不為空,我們呼叫遍歷函式。
3.進入遍歷函式,我們定義乙個currentnode指向當前節點,然後判斷該節點的左指標域是否為空,如果不為空,則證明該節點還有左子樹,我們接著呼叫遍歷函式,直到該節點的左指標域為空。
4.當左指標域為空的時候則證明已經到達了二叉排序樹的最左邊的節點,也是最小的乙個節點。
5.此時我們將lastnode賦給currentnode的左指標域(第乙個節點的左指標域為空),然後判斷lastnode是否為空,如果不為空,那麼將lastnode的右指標域賦值currentnode。
6.接著我們將currentnode賦值給lastnode。
7.判斷當前的節點是否有右子樹,如果有我們還需要遍歷其右子樹,然後重複5,6。
8.遞迴結束,我們返回了最後乙個節點的指標,此時我們需要的是第乙個節點的指標,所以我們需要使用乙個迴圈,只要head指標不為空並且指標的左指標域不為空,我們將指標的左指標域賦給該指標,指標往前移動1乙個位置,直至到達第乙個指標。
9.返回指標head。
/*
struct treenode
};*/
class solution
get(prootoftree);
treenode * head=lastnode;
while(head!=null && head->left!=null)
return head;
}void get(treenode * root)
currentnode->left=lastnode;
if(lastnode!=null)
lastnode=currentnode;
if(root->right!=null)
}};
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...