日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

MS

發布時間:2023/12/19 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 MS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

## 1. 把二元查找樹轉變成排序的雙向鏈表 ##
### 題目: 輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。 ###
要求不能創建任何新的結點,只調整指針的指向。

10
/
614
//
48 1216
轉換成雙向鏈表 4=6=8=10=12=14=16。
首先我們定義的二元查找樹節點的數據結構如下:

1 struct BSTreeNode 
2     {
3         int m_nValue; // value of node 
4         BSTreeNode *m_pLeft; // left child of node 
5         BSTreeNode *m_pRight; // right child of node 
6     };

下面是使用C++泛型寫的一種算法:

  1 #include "stdafx.h"
  2 #include <string>
  3 #include <iostream>
  4 using namespace std;
  5 
  6 template<typename T>
  7 struct BSTTreeNode
  8 {
  9     BSTTreeNode(T v, BSTTreeNode* lNode = NULL, BSTTreeNode* rNode=NULL) 
 10         :m_Value(v), m_pLeft(lNode), m_pRight(rNode){}
 11     T m_Value;
 12     BSTTreeNode* m_pLeft;
 13     BSTTreeNode* m_pRight;
 14 };
 15 
 16 
 17 template<typename T>
 18 void TravelBSTree(BSTTreeNode<T> *root)
 19 {
 20     if (NULL == root)
 21     {
 22         return;
 23     }
 24 
 25     TravelBSTree(root->m_pLeft);
 26 
 27     printf("%d ", root->m_Value);
 28     
 29     TravelBSTree(root->m_pRight);
 30     
 31 }
 32 
 33 template<typename T>
 34 void TravelBSTreeAsList(BSTTreeNode<T> *head, bool bReverseTravel = false)
 35 {
 36     BSTTreeNode<T>* pNode = head;
 37     while (pNode)
 38     {
 39         printf("%d ", pNode->m_Value);
 40         if (!bReverseTravel)
 41         {
 42             pNode = pNode->m_pRight;
 43         }
 44         else
 45         {
 46             pNode = pNode->m_pLeft;
 47         }
 48     }
 49 }
 50 
 51 //思路:
 52 //查找樹,中序遍歷得到的節點排序即為排序的鏈表,而要求排序的雙向鏈表,
 53 //1. 假設lt為左子樹的中序遍歷的尾結點,rh為右子樹中序遍歷的頭結點
 54 //2. 化繁為簡,如果只有root, lt, rh三個節點,此時只須然這幾個節點連接起來即可。
 55 //3. 分別遍歷左右子樹,重復上述過程。
 56 template<typename T>
 57 void BSTreeHelper(BSTTreeNode<T>* &head, BSTTreeNode<T>* &tail, BSTTreeNode<T>* root)
 58 {
 59     //step 1.
 60     BSTTreeNode<T>* lt = NULL;//左子樹尾結點
 61     BSTTreeNode<T>* rh = NULL;//右子樹頭結點
 62 
 63     if (NULL == root)
 64     {
 65         head = nullptr;
 66         tail = nullptr;
 67         return;
 68     }
 69 
 70     //step 3.
 71     BSTreeHelper(head, lt, root->m_pLeft);
 72     BSTreeHelper(rh, tail, root->m_pRight);
 73 
 74     //step 2.
 75     if (NULL != lt)
 76     {
 77         lt->m_pRight = root;
 78         root->m_pLeft = lt;
 79     }
 80     else
 81     {
 82         head = root;
 83     }
 84 
 85     if (NULL != rh)
 86     {
 87         root->m_pRight = rh;
 88         rh->m_pLeft = root;
 89     }
 90     else
 91     {
 92         tail = root;
 93     }
 94 }
 95 
 96 template<typename T>
 97 BSTTreeNode<T>* TreeToLinkedList(BSTTreeNode<T>* root)
 98 {
 99     BSTTreeNode<T>* head = NULL;
100     BSTTreeNode<T>* tail = NULL;
101 
102     BSTreeHelper(head, tail, root);
103 
104     return head;
105 }
106 
107 int _tmain(int argc, _TCHAR* argv[])
108 {
109     int arr[] = {4, 6, 8, 10, 12, 14, 16};
110 
111     BSTTreeNode<int> node4(4);
112     BSTTreeNode<int> node8(8);
113     BSTTreeNode<int> node6(6, &node4, &node8);
114     BSTTreeNode<int> node12(12);
115     BSTTreeNode<int> node16(16);
116     BSTTreeNode<int> node14(14, &node12, &node16);
117     BSTTreeNode<int> node10(10, &node6, &node14);
118     BSTTreeNode<int>* pRoot = &node10;
119 
120     printf("Travel BSTree: 
");
121     TravelBSTree<int>(pRoot);
122     printf("
");
123 
124     TreeToLinkedList<int>(pRoot);
125 
126     printf("Travel BSTree: 
");
127     TravelBSTreeAsList<int>(&node4, false);
128     printf("
");
129     
130     TravelBSTreeAsList<int>(&node16, true);
131     printf("
");
132 
133     return 0;
134 }

總結

以上是生活随笔為你收集整理的MS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。