資料結構學習(c++)——二叉樹 (轉)
注:本文只是對學習清華殷人昆《資料結構(用面向方法與c++描述)》的人有些微幫助,其他人就沒有必要浪費時間看了。因為老實說這本書裡的程式碼實現的確不怎麼樣。
我的目的,就是努力實現和書裡的程式碼相同的介面,盡最大可能和原始碼一摸一樣。因為這樣的話,一則自己以後看起來比較方便,只要對著課本翻翻就行了;二則這樣可能對別的學這本書的人有一定的好處。由於自己的習慣,我在原書的類名前加了_。
/*
Name: _BinaryTree.h
Copyright:
Author: elmar
Date: 19-07-03 23:43
Description:
*/
#ifndef _BinaryTree_H
#define _BinaryTree_H
#include
#include
using namespace std;
template
template
{
friend class _BinaryTree
public:
_BinTreeNode():data(Type()), leftChild(NULL), rightChild(NULL){}
_BinTreeNode(Type item,
_BinTreeNode
_BinTreeNode
_BinTreeNode(const _BinTreeNode
Type GetData() const {return data;}
_BinTreeNode
_BinTreeNode
void SetData(const Type& item) {data = item;}
void SetLeft(_BinTreeNode
void SetRight(_BinTreeNode
_BinTreeNode
private:
_BinTreeNode
Type data;
};
template
{
public:
_BinaryTree(): (NULL){}
_BinaryTree(Type value): RefValue(value), root(NULL){}
_BinaryTree(const _BinaryTree
virtual ~_BinaryTree(){destroy(root);}
virtual bool IsEmpty() {return root == NULL ? true : false;}
virtual _BinTreeNode
{return root == NULL || root == current ? NULL : Parent(root, current);}
virtual _BinTreeNode
{return root != NULL ? current->leftChild : NULL;}
virtual _BinTreeNode
{return root != NULL ? current->rightChild : NULL;}
virtual int Insert(const Type& item){return Insert(root, item);}
// virtual int Find(const Type& item) const;
const _BinTreeNode
_BinaryTree
_BinaryTree
friend istream& operator >> (istream& in, _BinaryTree
{
Type item;
cout << "Construct binary tree: " << endl;
cout << "Input data (end with " << Tree.RefValue < in >> item;
while (item != Tree.RefValue)
{
Tree.Insert(item);
cout << "Input data (end with " << Tree.RefValue < in >> item;
}
return in;
}
friend ostream& operator << (ostream& out, _BinaryTree
{
out << "Preorder traversal of binary tree." << endl;
Tree.Traverse(Tree.root, out);
out << endl;
return out;
}
private:
_BinTreeNode
Type RefValue; //資料輸入停止的標誌
_BinTreeNode
int Insert(_BinTreeNode
void Traverse(_BinTreeNode
// int Find(_BinTreeNode
void destroy(_BinTreeNode
_BinaryTree
};
template
_BinTreeNode
_BinTreeNode
{
data = item;
leftChild = left;
rightChild = right;
}
template
{
leftChild = b.leftChild; rightChild = b.rightChild; data = b.data;
return *this;
}
template
{
root = NULL;
RefValue = bt.RefValue;
Append(bt);
}
template
{
if (current !=NULL)
{
destroy(current->leftChild);
destroy(current->rightChild);
delete current;
}
}
template
_BinaryTree
{
if (start == NULL) return NULL;
if (start->leftChild == current || start->rightChild == current) return start;
_BinTreeNode
if ((p = Parent(start->leftChild, current)) != NULL) return p;
else return Parent(start->rightChild, current);
}
template
_BinaryTree
{
if (current != NULL)
{
out << current->data << ;
Traverse(current->leftChild, out);
Traverse(current->rightChild, out);
}
}
//層次遍歷以current為根的二叉樹,把item插入在第一個葉子的的左指標,
//或第一個缺右孩子的節點的右指標
template
_BinaryTree
{
_BinTreeNode
if (p == NULL) return -1;
if (current == NULL)
{
current = p;
return 0;
}
else
{
deque<_bintreenode>*>* deck = new deque<_bintreenode>*>;//佇列
deck->push_back(current);
typename deque<_bintreenode>*>::const_iterator iter;
while (true)
{
iter = deck->begin();
deck->pop_front();
if ((*iter)->leftChild == NULL)
{
(*iter)->leftChild = p;
delete deck;
return 0;
}
else if ((*iter)->rightChild == NULL)
{
(*iter)->rightChild = p;
delete deck;
return 0;
}
else
{
deck->push_back((*iter)->leftChild);
deck->push_back((*iter)->rightChild);
}
}
}
}
template
{
deque<_bintreenode>*>* deck = new deque<_bintreenode>*>;
deck->push_back(bt.root);
typename deque<_bintreenode>*>::const_iterator iter;
while (!deck->empty())
{
iter = deck->begin();
deck->pop_front();
this->Insert((*iter)->GetData());
if ((*iter)->leftChild != NULL)
{
deck->push_back((*iter)->leftChild);
}
if ((*iter)->rightChild != NULL)
{
deck->push_back((*iter)->rightChild);
}
}//while
delete deck;
return *this;
}
template
{
RefValue = bt.RefValue;
if (bt.root == NULL) return *this;
if (!this->IsEmpty())this->destroy(root);
return this->Append(bt);
}
#endif
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959478/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【3】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【1】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——樹(總結) (轉)資料結構C++
- 資料結構二叉樹學習資料結構二叉樹
- 【資料結構】二叉樹(c++)資料結構二叉樹C++
- 資料結構 其五 樹與二叉樹學習總結資料結構二叉樹
- 資料結構學習(C++)——序言 (轉)資料結構C++
- 資料結構(樹):二叉樹資料結構二叉樹
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 重學資料結構之樹和二叉樹資料結構二叉樹
- 重學資料結構(六、樹和二叉樹)資料結構二叉樹
- 資料結構學習(C++)——圖(總結) (轉)資料結構C++
- 資料結構學習之樹結構資料結構
- 資料結構-二叉樹資料結構二叉樹
- 資料結構 - 二叉樹資料結構二叉樹
- 【資料結構】二叉樹!!!資料結構二叉樹
- 資料結構學習系列之二叉搜尋樹詳解!資料結構
- 資料結構學習(C++)——遞迴【1】 (轉)資料結構C++遞迴
- 資料結構-平衡二叉樹資料結構二叉樹
- 資料結構之「二叉樹」資料結構二叉樹
- 資料結構——平衡二叉樹資料結構二叉樹
- PTA練習7 二叉樹(1)——資料結構二叉樹資料結構
- 資料結構學習(C++)——迴圈連結串列 (轉)資料結構C++
- 資料結構學習(C++)——雙向連結串列 (轉)資料結構C++
- 資料結構學習(C++)——遞迴【2】(1) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(2) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(3) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(4) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(1) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(2) (轉)資料結構C++遞迴
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構——二叉樹進階資料結構二叉樹
- 資料結構-二叉搜尋樹資料結構
- 資料結構 二叉樹遍歷資料結構二叉樹
- 【資料結構】二叉搜尋樹!!!資料結構
- 資料結構分析之二叉樹資料結構二叉樹
- 【資料結構】回顧二叉樹資料結構二叉樹