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 }
總結
- 上一篇: 一般控制矩阵转能控标准型
- 下一篇: 我的世界怎么联机手机