牛客網-二叉搜索樹轉換成一個排序的雙向鏈表

題目描述

輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向.


第一種方法:

class Solution {
public:
	void buildseq(TreeNode* pRootOfTree)
	{
		if (pRootOfTree != NULL){   //各元素依次入棧
			buildseq(pRootOfTree->left);
			node.push_back(pRootOfTree);
			buildseq(pRootOfTree->right);
		}
	}

	TreeNode* Convert(TreeNode* pRootOfTree)
	{
		int i;
		buildseq(pRootOfTree);
		if (node.size() == 0)head=NULL;   //修改前後鄰居
		else{
			head = node[0];
			for (i = 0; i < node.size()-1; i++){
					node[i]->right = node[i + 1];
					node[i + 1]->left = node[i];
			}
		}
		return head;
	}
	vector<TreeNode *>node;
	TreeNode * head=NULL;
};
這種方法思想比較簡單,先中序遍歷二叉樹,將每個結點保存在容器裏,然後對容器裏面的元素進行首尾相連;


第二種方法:

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree){
    if (pRootOfTree == 0)   return 0;   //空樹①
    TreeNode *head = 0;
    if (pRootOfTree->left == 0 && pRootOfTree->right == 0)return pRootOfTree;
    TreeNode* lhead = 0;  
TreeNode* rhead = 0;
    if (pRootOfTree->left != 0) {
        lhead = Convert(pRootOfTree->left); //返回左子樹的頭結點④
        head = lhead;
        while (lhead->right)lhead = lhead->right;
        lhead->right = pRootOfTree;    //左子樹進行鏈接,直接向右搜索
        pRootOfTree->left = lhead;
    }
    else head = pRootOfTree;      //⑤
    if (pRootOfTree->right != 0) {   //能到這裏說明只有根的左子樹爲空,則根結點肯是這這顆樹的lead
        rhead = Convert(pRootOfTree->right);  
        pRootOfTree->right = rhead;
        rhead->left = pRootOfTree;
    }
    return head;  //將子樹的最左結點一直返回
}            //直到根結點
};

這種方法在原地進行操作,無需容器,通過這種方法建立的雙向鏈表的頭結點的left指針域爲空,尾節點的right指針域爲空,最後要調整這兩個結點的指針域才能構成完全

首尾相連的雙向鏈表!!!

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