將二叉搜尋樹轉換成乙個排序雙向鍊錶

2021-08-01 15:58:12 字數 3323 閱讀 3129

將二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

定義:

二叉搜尋樹也叫二叉查詢樹或二叉排序樹,它可以是一顆空樹,或者是滿足如下性質的二叉樹:若該樹的左子樹不為空,則左子樹上所有節點的值均小於根節點的值,若該樹的右子樹不為空,則右子樹上所有節點的值均大於根節點的值。

實現:二叉搜尋樹具有二叉樹的基本性質,有兩個指標分別指向它的左右孩子,在雙向鍊錶中每個節點也有兩個指標分別指向該節點的前驅和後繼,由於這兩種資料結構具有相似的性質,題目要求將二叉搜尋樹轉化為有序的雙向鍊錶,所以在實現轉化的過程中我們可以將原來指向左子樹的節點轉化為前驅節點,將原來指向右子樹的節點轉化為指向後繼的節點。

**實現:

[cpp]view plain

copy

print

? #include 

#include 

#include 

using

namespace std;  

template

struct searchbinarytreenode  

};  

template

class searchbinarytree  

~searchbinarytree()  

{}  

bool insert(const k& key)            //建樹

node* parent = null;  

node* cur = _root;  

while (cur)  

else

if (cur->_key 

else

}  if (parent->_key 

if (parent->_key > key)  

}  void inorder()    //中序遍歷

//將二叉搜尋樹轉換成乙個排序的雙向鍊錶

node* tosortlist()  

_tosortlist(_root,prev);  

return head;  

}  protected:  

void _inorder(node* root)  

_inorder(root->_left);  

cout <_key>_inorder(root->_right);  

}  void _tosortlist(node* cur, node*& prev)  

_tosortlist(cur->_left, prev);  

cur->_left = prev;  

if (prev)  

prev = cur;  

_tosortlist(cur->_right, prev);  

}  protected:  

node* _root;    //根節點

};  

#include #include #include using namespace std;

template struct searchbinarytreenode

};template class searchbinarytree

~searchbinarytree()

{} bool insert(const k& key) //建樹

node* parent = null;

node* cur = _root;

while (cur)

else if (cur->_key < key)

else

}if (parent->_key < key)

if (parent->_key > key)

}void inorder() //中序遍歷

//將二叉搜尋樹轉換成乙個排序的雙向鍊錶

node* tosortlist()

_tosortlist(_root,prev);

return head;

}protected:

void _inorder(node* root)

_inorder(root->_left);

cout << root->_key << " ";

_inorder(root->_right);

} void _tosortlist(node* cur, node*& prev)

_tosortlist(cur->_left, prev);

cur->_left = prev;

if (prev)

prev = cur;

_tosortlist(cur->_right, prev);

}protected:

node* _root; //根節點

};

[cpp]view plain

copy

print

?#include "tosortlist.h"

void testtosortlist()  

;  size_t size = sizeof(arr) / sizeof(arr[0]);  

searchbinarytree qq;  

for (size_t i = 0; i 

cout <

<

qq.inorder();  

searchbinarytreenode* head = qq.tosortlist();  

cout <

<

while (null != head)  

cout <

}  int main()    

#include "tosortlist.h"

void testtosortlist()

; size_t size = sizeof(arr) / sizeof(arr[0]);

searchbinarytreeqq;

for (size_t i = 0; i < size; ++i)

cout << "搜尋二叉樹中序遍歷:" << "";

qq.inorder();

searchbinarytreenode* head = qq.tosortlist();

cout << "雙向鍊錶序列:" << "";

將二叉搜尋樹轉換成乙個排序的雙向鍊錶

二叉查詢樹 binary search tree 也稱有序二叉樹 ordered binary tree 排序二叉樹 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 1.若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2.若任意節點的右子樹不空,則右子...

將二叉搜尋樹轉換成乙個排序的雙向鍊錶

題目具體 將二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新的結點,只能調整樹中結點指標的指向,也就是left當prev,right當next。以如下的二叉樹為例 要將此二叉樹轉化稱為如下的雙向鍊錶 將pleft指標當作指向前乙個結點的指標,將pright指標當作指向後乙個結點的指標。則步驟可...

將二叉搜尋樹轉換成排序的雙向鍊錶

二叉搜尋樹的中序遍歷得到的是乙個已排序的序列。因此可以仿照中序遍歷,依次訪問結點並改變結點的指向,使其構成乙個雙向鍊錶。在訪問當前結點之前,需要先訪問左子樹,並改變左子樹中的結點指向,使其構成雙向鍊錶。同時需要獲取左子樹構成雙向鍊錶的頭和尾結點。頭結點是整棵樹構成的雙向鍊錶的頭結點,而尾結點是左子樹...