資料結構和演算法經典100題-第1題
阿新 • • 發佈:2019-02-03
說在開頭的話:
如果拿金庸武俠做個比喻,資料結構和演算法的學習就好比是程式設計師內功。內功的修煉往往不能一蹴而就,需要水滴石川。在部落格中的這個分類中,專門記錄我在資料結構和演算法中的修煉。希望資料結構和演算法的武林高手們多多指導,希望一起有志於提高內功的朋友們和我一起切磋進步。
從網路上看了很多關於資料結構和演算法的學習方法。我採取的學習路線也並不是最好的,總結下來是:
- 觀看麻省理工大學的公開課《演算法導論》視訊
- 閱讀資料結構和演算法的經典書籍《演算法導論》
- 翻看書籍《大話資料結構》
- 閱讀書籍《C++資料結構與演算法》
完成以上三個步驟後,主要還有兩方面需要做 - 工作中做專案的設計中,選擇合適和高效的資料結構
- 在休息的時候,做資料結構和演算法經典100題
計劃將資料結構和演算法經典的100題用一個月的時間實現,部落格中的資料結構和演算法分類暫時會記錄這方面的內容。
開始第一題:
輸入一棵二元查詢樹,將該二元查詢樹轉換成一個排序的雙向連結串列。 要求不能建立任何新的結點,只調整指標的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
轉換成雙向連結串列
4=6=8=10=12=14=16。
題目分析:
粗看此題目可以看到轉換後的雙向連結串列是按照從小到大的順序排序的。而我們知道中序遍歷一棵二元查詢樹就是按照值的從小到大的順序訪問樹的各結點。那麼我們這裡就基本確定解此問題的方法的遍歷方法為中序遍歷。那麼剩下的問題其實就是一個指標作為快取暫存中間的結點資訊。
程式原始碼:
/*
*
* 題目1
*輸入一棵二元查詢樹,將該二元查詢樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只調整指標的指向。
* 10
* / \
* 6 14
* /\ / \
* 4 8 12 16
*
* 轉換成雙向連結串列 4=6=8=10=12=14=16。
*
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define valueType int
#define nodeNum 7
class node {
public:
node(int value);
~node();
valueType m_value;
node * m_left;
node * m_right;
};
node::node(int value) {
m_value = value;
m_left = NULL;
m_right = NULL;
}
node::~node() {
}
class bst_tree {
public:
bst_tree();
~bst_tree();
node * get_root();
void LDR(node* obj);
void convert(node * obj);
private:
node * root;
};
bst_tree::bst_tree() {
node *tmp_0 = new node(10);
node *tmp_1 = new node(6);
node *tmp_2 = new node(14);
node *tmp_3 = new node(4);
node *tmp_4 = new node(8);
node *tmp_5 = new node(12);
node *tmp_6 = new node(16);
tmp_0->m_left = tmp_1;
tmp_0->m_right = tmp_2;
tmp_1->m_left = tmp_3;
tmp_1->m_right = tmp_4;
tmp_2->m_left = tmp_5;
tmp_2->m_right = tmp_6;
root = tmp_0;
}
/* Clipped... */
bst_tree::~bst_tree() {
/* ... */
}
node* bst_tree::get_root() {
return root;
}
/* Inorder traveral a bst Tree. */
void bst_tree::LDR(node * obj) {
// cout<<"value:"<<obj->m_value<<endl;
if (NULL != obj->m_left) {
LDR(obj->m_left);
}
// cout<<"LDR:"<<obj->m_value<<endl;;
convert(obj);
if (NULL != obj->m_right) {
LDR(obj->m_right);
}
return;
}
node * g_double_list_head = NULL;
node * element_index = NULL;
/* Convert a bst-tree's node to a double-list node. */
void bst_tree::convert(node * obj) {
if (NULL == element_index) {
g_double_list_head = obj;
element_index = obj;
return;
}
obj->m_left = element_index;
element_index->m_right = obj;
//obj->m_right = NULL;
element_index = obj;
return;
}
int main(void) {
/* Create a bst tree. */
bst_tree * tree = new bst_tree();
tree->LDR(tree->get_root());
/* Traverse double-list. */
node * tmp = g_double_list_head;
while ( NULL != tmp ) {
cout<<"Traverse double-list:"<<tmp->m_value<<endl;
if (NULL != tmp->m_left) {
cout<<"Traverse double-list m_left:"<<tmp->m_left->m_value<<endl;
}
if (NULL != tmp->m_right) {
cout<<"Traverse double-list m_right:"<<tmp->m_right->m_value<<endl;
}
tmp = tmp->m_right;
}
return 0;
}
列印輸出