1. 程式人生 > >二叉樹之二叉連結串列的類模板實現

二叉樹之二叉連結串列的類模板實現

該類模板實現了一個二叉樹的模板類,採用二叉連結串列實現。

定義二叉樹節點類,採用二叉連結串列實現。

[cpp] view plaincopyprint?
  1. /////////////////////////
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <stack>
  5. #include <deque>
  6. usingnamespace std;  
  7. template<class T>  
  8. struct BinTreeNode  //二叉樹節點類的定義,使用二叉連結串列
  9. {  
  10.     T data;  
  11.     BinTreeNode<T> *leftChild, *rightChild;  
  12.     BinTreeNode():leftChild(NULL),rightChild(NULL){}  
  13.     BinTreeNode(T x,BinTreeNode<T> *l=NULL,BinTreeNode<T> *r=NULL):data(x),leftChild(l),rightChild(r){}  
  14. };  

二叉樹的模板類實現如下:可進行相應的功能擴充套件。

介面部分:

[cpp]
 view plaincopyprint?
  1. template<class T>  
  2. class BinaryTree//二叉樹的模板類
  3. {  
  4. public:  
  5.     BinaryTree():root(NULL){}  
  6.     BinaryTree(char x):root(NULL),RefValue(x){}  
  7.     BinaryTree(const BinaryTree<T>& rhs){root=copy(rhs.root);}//copy建構函式
  8.     BinaryTree<T>& operator=(const
     BinaryTree<T>& rhs);//copy 賦值運算子;析構+copy建構函式  
  9.     ~BinaryTree(){destroy(root);}//解構函式
  10.     bool isEmpty()const{return root!=NULL?false:true;}  
  11.     BinTreeNode<T>* leftChild(BinTreeNode<T>* current)const{return current!=NULL?current->leftChild:NULL;}  
  12.     BinTreeNode<T>* rightChild(BinTreeNode<T>* current)const{return current!=NULL?current->rightChild:NULL;}  
  13.     BinTreeNode<T>* parent(BinTreeNode<T>* current)const{return (root==NULL || current==root)?NULL:parent(root,current);}//尋找其父節點
  14.     BinTreeNode<T>* getRoot()const{return root;}  
  15.     void inOrder(void (*visit)(BinTreeNode<T> *p)){inOrder(root,visit);}//中序遞迴遍歷
  16.     void preOrder(void (*visit)(BinTreeNode<T> *p)){preOrder(root,visit);}//前序遞迴
  17.     void postOrder(void (*visit)(BinTreeNode<T> *p)){postOrder(root,visit);}//後序遞迴
  18.     void levelOrder(void (*visit)(BinTreeNode<T> *p));//使用佇列的層次遍歷
  19.     int size()const {return size(root);}//使用後序遞迴遍歷求節點個數
  20.     int height()const {return height(root);}//使用後序遞迴遍歷求二叉樹的高度
  21. protected:  
  22.     BinTreeNode<T> *root;  
  23.     char RefValue;//資料輸入停止標誌
  24.     void destroy(BinTreeNode<T>* subTree);//遞迴刪除二叉樹節點,後序遍歷刪除
  25.     BinTreeNode<T>* copy(const BinTreeNode<T> *orignode);//copy構造;前序
  26.     BinTreeNode<T>* parent(BinTreeNode<T>* subTree,BinTreeNode<T>* current)const;//返回父節點
  27.     void traverse(BinTreeNode<T>* subTree,ostream& out)const;//按前序方式遍歷輸出每個節點的值
  28.     void createBinTree(istream& in,BinTreeNode<T>* & subTree);//採用廣義表表示的二叉樹建立方法
  29.     void inOrder(BinTreeNode<T> *subTree,void (*visit)(BinTreeNode<T> *p));//中序遍歷
  30.     void preOrder(BinTreeNode<T> *subTree,void (*visit)(BinTreeNode<T> *p));//前序遍歷
  31.     void postOrder(BinTreeNode<T> *subTree,void (*visit)(BinTreeNode<T> *p));//後序遍歷
  32.     int size(BinTreeNode<T> *subTree)const;//使用後序遞迴遍歷求節點個數
  33.     int height(BinTreeNode<T> *subTree)const;//使用後序遞迴遍歷求二叉樹的高度
  34.     friend ostream& operator<< <T>(ostream& out,const BinaryTree<T>& rhs);//add <T> 前序輸出二叉樹
  35.     friend istream& operator>> <T>(istream& in, BinaryTree<T>& rhs);      //add <T> 採用廣義表表示方式建立二叉樹
  36. };  

相應成員函式的具體實現: [cpp] view plaincopyprint?
  1. template<class T>  
  2. void BinaryTree<T>::destroy(BinTreeNode<T>* subTree)  
  3. {  
  4.     if(subTree!=NULL){  
  5.         destroy(subTree->leftChild);  
  6.         destroy(subTree->rightChild);  
  7.         delete subTree;  
  8.     }  
  9. }  
  10. template<class T>  
  11. BinTreeNode<T>* BinaryTree<T>::parent(BinTreeNode<T>* subTree,BinTreeNode<T>* current)const
  12. {  
  13.     if(subTree==NULL) return NULL;  
  14.     if(subTree->leftChild==current || subTree->rightChild==current) return subTree;  
  15.     BinTreeNode<T>* p;  
  16.     if((p=parent(subTree->leftChild,current))!=NULL)  
  17.         return p  
  18.     else
  19.         return parent(subTree->rightChild,current);  
  20. }  
  21. template<class T>  
  22. void BinaryTree<T>::traverse(BinTreeNode<T>* subTree,ostream& out)const
  23. {  
  24.     if(subTree!=NULL){  
  25.         out<<subTree->data<<" ";  
  26.         traverse(subTree->leftChild,cout);  
  27.         traverse(subTree->rightChild,out);  
  28.     }  
  29. }  
  30. template<class T>  
  31. void BinaryTree<T>::createBinTree(istream& in,BinTreeNode<T>* & subTree)  
  32. {  
  33.     stack<BinTreeNode<T>* > s;  
  34.     subTree=NULL;  
  35.     BinTreeNode<T> *p,*t;  
  36.     unsigned int k;  
  37.     T ch;  
  38.     in>>ch;//雖然是模板類,但是目前只支援字元型,不然會報錯
  39.     while(ch!=RefValue){  
  40.         switch(ch){  
  41. 相關推薦

    連結串列模板實現

    該類模板實現了一個二叉樹的模板類,採用二叉連結串列實現。 定義二叉樹節點類,採用二叉連結串列實現。 [cpp] view plaincopyprint? ///////////////////////// #incl

    [資料結構]連結串列模板實現

    該類模板實現了一個二叉樹的模板類,採用二叉連結串列實現。定義二叉樹節點類,採用二叉連結串列實現。///////////////////////// #include <iostream> #include <cstdlib> #include <

    C++實現連結串列

    #include "stdafx.h" #include <iostream> #include <deque> using namespace std; template<typename T> struct TreeNode{

    [leetcode]114. Flatten Binary Tree to Linked List將展成一個連結串列

    Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 / \ 2 5 / \ \ 3 4 6 The flattened

    搜尋轉換為雙向連結串列的Java實現 出現的一些問題及解決

    題目 二叉搜尋樹轉換為雙向排序連結串列,要求不能新增任何新的結點,只能調整樹中節點的指向。 思路 二叉搜尋樹的左子樹中結點的值總是小於根結點,右子樹中結點的值總是大於根結點,所以二叉搜尋樹的中序遍歷結果就是我們最終想要得到的連結串列順序,如圖1: 所以我們在轉

    2.15 將搜尋轉換成雙向連結串列

    【題目】:   對二叉樹的節點來說,有本身的值域,有指向上一個節點和下一個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為一個有序的雙向連結串列   例如,節點定義為:   1 public class Node{ 2 public int value

    用C語言將轉換為雙向連結串列

    樹是一種重要的資料結構,尤其是二叉樹。二叉樹的用處比較廣泛,用得最多的樹就是二叉樹。 二叉樹的每個結點最多有兩個子結點,左邊的一般稱為左孩子,右邊的稱為右孩子。根節點兩邊 的稱為左子樹和右子樹。二叉樹

    轉化為雙向連結串列

    遞迴解法:(1)如果二叉樹查詢樹為空,不需要轉換,對應雙向連結串列的第一個節點是NULL,最後一個節點是NULL(2)如果二叉查詢樹不為空: 如果左子樹為空,對應雙向有序連結串列的第一個節點是根節點,左邊不需要其他操作; 如果左子樹不為空,轉換左子樹,二叉查詢樹對應雙向有序

    將搜尋轉換成雙向連結串列

    題目 對二叉樹的節點來說, 有本身的值域, 有指向左孩子和右孩子的兩個指標; 對雙向連結串列的節點來說,有本身的值域, 有指向上一個節點和下一個節點的指標。 在結構上, 兩種結構有相似性, 現在有一棵搜尋二叉樹, 請將其轉換為一個有序的雙向連結串列。

    BST(搜尋)與雙向連結串列相互轉換

    1.BST->雙向連結串列a.中序遍歷(有序)b.插入節點樹結構package BSTLinkList; public class TreeNode { int val = 0; Tree

    將搜尋轉化為雙向連結串列

    用二叉樹的_pLeft表示_prev,用二叉樹的_pRight表示_next。 用中序遍歷的方式遍歷整棵二叉樹。 Node* BothwayList() { if(!_p

    平衡(刪除節點)

    類似於新增操作,從平衡二叉樹中刪除節點也分為兩步,第一步完成節點的刪除,第二步找到因為刪除而導致不滿足平衡二叉樹要求的子樹並對其進行調整。 一、 刪除節點 從平衡二叉樹中刪除節點更為複雜。首先第一步需要找到要刪除的節點x,並分情況進行處理: 如果要刪除的節點為葉子節點,就

    C++中用模板(結點連結串列實現的單鏈表的合併操作!

    程式碼通俗易通,如下 List.h #include<stdio.h> template <class T> class ListNode { T data; ListNode<T>* link; public:

    C++連結串列模板

    記錄自己寫的一個連結串列類模板,兩個標頭檔案:一個是節點標頭檔案Node.h,一個是連結串列標頭檔案LinkList.h。 Node.h #pragma once #include <iostream> template <ty

    Linu c++ 簡單實現連結串列模板

        之前在C語言裡面有實現連結串列,現在用c++簡單的實現連結串列類,只實現了插入節點和排序,我先開個好頭,其餘的程式碼基本上和C語言裡面的程式碼差不多,直接上程式碼咯;#include <iostream>#include <cstdio>usi

    連結串列模板

    #include <iostream> using namespace std; class CNode //定義一個節點類 { public: CNode *m_pNext; //定義一個節點指標,指向下一個節點 int m_Data; //定義節點的

    線索連結串列

    上一章介紹了二叉樹的二叉連結串列的實現,並給出了相關遍歷演算法,但是,當以二叉連結串列作為二叉樹的儲存結構時,無法直接得到結點在任一序列中的前驅與後繼資訊。為了規避這個弊端,本章將引入線索二叉樹的概念 ,並給出相關Java實現。 為了得到前驅與後繼的資

    連結串列儲存

    節點形態: 實現: /****************************************** 二叉樹的二叉連結串列儲存 by Rowandjj 2014/5/18 ****************************************

    採用連結串列儲存,複製的演算法(的應用)

    二叉樹採用二叉連結串列儲存,試寫出複製一棵二叉樹的演算法。 話不多說上程式碼: #include<stdio.h> #include<stdlib.h> typedef struct BiTnode   {   &

    [] △ 6.65 已經前序序列、中序序列 建立 連結串列

    題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.65 【題目】6.65 已知一棵二叉樹的前序序列和中序序列分別存於兩個一維陣列中,試編寫演算法建立該二叉樹的二叉連結串列。 【答案】 // 6.65