1. 程式人生 > >【劍指offer】二叉搜索樹轉雙向鏈表,C++實現

【劍指offer】二叉搜索樹轉雙向鏈表,C++實現

pointer 題目 size point nod off log tco public

原創博文,轉載請註明出處!

# 題目

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

  • 二叉樹節點的定義
  1 /*
  2 struct TreeNode {
  3 	int val;
  4 	struct TreeNode *left;
  5 	struct TreeNode *right;
  6 	TreeNode(int x) :
  7 			val(x), left(NULL), right(NULL) {
  8 	}
  9 };*/
  • 二叉搜索樹轉雙向鏈表的例子

技術分享圖片

# 思路

  • 二叉搜索樹的性質
    • 二叉搜索樹是左子樹<根節點<右子樹
    • 二叉搜索樹的中序遍歷是遞增的有序序列
  • 二叉搜索樹轉雙向鏈表的思路
    • 二叉搜索樹的根節點的左指針指向左子樹的最大節點,根節點的右子樹指向右子樹的最小節點。

技術分享圖片


# 代碼

  1 /*
  2 struct TreeNode {
  3     int val;
  4     struct TreeNode *left;
  5     struct TreeNode *right;
  6     TreeNode(int x) :
  7             val(x), left(NULL), right(NULL) {
  8     }
  9
};*/
10 class Solution { 11 public: 12 TreeNode* Convert(TreeNode* pRootOfTree) 13 {/* 14 struct TreeNode { 15 int val; 16 struct TreeNode *left; 17 struct TreeNode *right; 18 TreeNode(int x) : 19 val(x), left(NULL), right(NULL) { 20 } 21 };*/ 22 class Solution { 23 public: 24
TreeNode* Convert(TreeNode* pRootOfTree) 25 { 26 // 雙向鏈表尾節點 27 TreeNode* list_last = nullptr; 28 29 // 遞歸轉換 30 ConvertNode(pRootOfTree,list_last); 31 32 // 雙向鏈表首節點 33 while(list_last->left != nullptr) // 邊界條件 34 { 35 list_last = list_last->left; 36 } 37 38 // 返回雙向鏈表的首節點 39 return list_last; 40 } 41 42 void ConvertNode(TreeNode* cur,TreeNode* list_last) 43 { 44 // 邊界條件 45 if(cur==nullptr) return ; 46 47 // 遍歷左子樹 48 if(cur->left != nullptr) ConvertNode(cur->left,list_last); 49 50 // 實現雙向鏈接(建立連接) 51 cur->left = list_last; 52 if(list_last != nullptr) list_last->right = cur; 53 list_last = cur; 54 55 //遍歷右子樹 56 if(cur->right != nullptr) ConvertNode(cur->right,list_last); 57 } 58 }; 59 if (pRootOfTree == NULL)return NULL; 60 61 TreeNode *pointer = NULL; 62 63 convert2List(pRootOfTree, pointer); 64 65 while (pointer->left!=NULL) 66 { 67 pointer = pointer->left; 68 } 69 return pointer; 70 } 71 void convert2List(TreeNode* pRoot,TreeNode *&pointer) 72 { 73 if (pRoot == NULL) 74 { 75 return; 76 } 77 { 78 if (pRoot->left != NULL) 79 { 80 convert2List(pRoot->left,pointer); 81 } 82 83 pRoot->left = pointer; 84 if (pointer != NULL) 85 { 86 pointer->right = pRoot; 87 } 88 89 pointer = pRoot; 90 if (pRoot->right!=NULL) 91 { 92 convert2List(pRoot->right, pointer); 93 } 94 } 95 } 96 };

【劍指offer】二叉搜索樹轉雙向鏈表,C++實現