亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)

 更新時(shí)間:2017年07月27日 16:43:38   作者:景初淺行  
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)的相關(guān)資料,這里提供實(shí)例代碼來(lái)幫助大家理解掌握二叉樹(shù),需要的朋友可以參考下

C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)(前序/中序/后序遞歸、非遞歸遍歷)

二叉樹(shù)的性質(zhì):

二叉樹(shù)是一棵特殊的樹(shù),二叉樹(shù)每個(gè)節(jié)點(diǎn)最多有兩個(gè)孩子結(jié)點(diǎn),分別稱(chēng)為左孩子和右孩子。

例:

實(shí)例代碼:

#include <iostream> 
#include <Windows.h> 
#include <stack> 
using namespace std; 
 
template <class T> 
struct BinaryTreeNode 
{ 
 int _data; 
 BinaryTreeNode<T>* _left; //左孩子 
 BinaryTreeNode<T>* _right;  //右孩子 
 BinaryTreeNode(const T& data) 
  :_data(data) 
  , _left(NULL) 
  , _right(NULL) 
 {} 
}; 
 
template <class T> 
class BinaryTree 
{ 
 typedef BinaryTreeNode<T> Node; 
public: 
 BinaryTree() 
  :_root(NULL) 
 {} 
 
 BinaryTree(T* arr, size_t n, const T& invalid=T()) 
 { 
  size_t index = 0; 
  _root = _CreatTree(arr, n, invalid, index); 
 } 
 
 void PreOrderR()  //前序遍歷 遞歸 
 { 
  _PreOrderR(_root); 
 } 
 
 void PreOrder()  //前序遍歷 非遞歸 
 { 
  _PreOrder(_root); 
 } 
 
 void InOrderR() //中序遍歷 遞歸 
 { 
  _InOrderR(_root); 
 } 
 
 void InOrder()   //中序遍歷  非遞歸 
 { 
  _InOrder(_root);  
 } 
 
 void PostOrderR()  //后序遍歷 左 右 根  遞歸 
 { 
  _PostOrderR(_root);  
 } 
 
 void PostOrder()  //后序遍歷 左 右 根  非遞歸 
 { 
  _PostOrder(_root);  
 } 
 
 ~BinaryTree() 
 {} 
 
protected: 
 //建樹(shù) arr:建樹(shù)使用的數(shù)組 n:數(shù)組大小 invalid:非法值 index:當(dāng)前下標(biāo) 
 Node* _CreatTree(T* arr, size_t n, const T& invalid, size_t& index) 
 { 
  Node* root = NULL; 
  if (index < n && arr[index] != invalid) 
  { 
   root = new Node(arr[index]); //根節(jié)點(diǎn) 
   root->_left = _CreatTree(arr, n, invalid, ++index); 
   root->_right = _CreatTree(arr, n, invalid, ++index); 
  } 
  return root;  
 } 
 
 void _PreOrderR(Node* root)  //前序遍歷 遞歸 
 { 
  if (root == NULL) 
  { 
   return; 
  } 
  cout << root->_data << " "; 
  _PreOrderR(root->_left); 
  _PreOrderR(root->_right); 
 } 
 
 void _PreOrder(Node* root)  //前序遍歷 非遞歸 
 { 
  stack<Node*> tty; 
  while (root != NULL || !tty.empty()) 
  { 
   if (root) 
   { 
    cout << root->_data << " "; 
    tty.push(root); 
    root = root->_left; 
   } 
   else 
   { 
    Node* temp = tty.top(); 
    tty.pop(); 
    root = temp->_right; 
   } 
  } 
 } 
 
 void _InOrderR(Node* root) //中序遍歷 遞歸 
 { 
  if (root == NULL) 
  { 
   return; 
  } 
  _InOrderR(root->_left); 
  cout << root->_data << " "; 
  _InOrderR(root->_right); 
 } 
 
 void _InOrder(Node* root) //中序遍歷 非遞歸 
 { 
  if (root == NULL) 
  { 
   return; 
  } 
  stack<Node*> tty; 
  while (root != NULL || !tty.empty()) 
  { 
   while (root) 
   { 
    tty.push(root); 
    root = root->_left; 
   } 
   //此時(shí)出了循環(huán)走到了最左葉子節(jié)點(diǎn) 
   Node* temp = tty.top(); 
   tty.pop(); 
   cout << temp->_data << " "; 
   root = temp->_right; 
  } 
 } 
 
 void _PostOrderR(Node* root)  //后序遍歷 左 右 根  遞歸 
 { 
  if (root == NULL) 
  { 
   return; 
  } 
  _PostOrderR(root->_left); 
  _PostOrderR(root->_right); 
  cout << root->_data << " "; 
 } 
 
 void _PostOrder(Node* root)  //后序遍歷 左 右 根  非遞歸 
 { 
  if (root == NULL) 
  { 
   return; 
  } 
  stack<Node*> tty; 
  Node* PreNode = NULL; //上一個(gè)訪(fǎng)問(wèn)的結(jié)點(diǎn) 
  tty.push(root); 
  while (!tty.empty()) 
  { 
   Node* cur = tty.top(); 
   //訪(fǎng)問(wèn)的當(dāng)前節(jié)點(diǎn)左右孩子均為空或者當(dāng)前節(jié)點(diǎn)左右子樹(shù)均已經(jīng)訪(fǎng)問(wèn)過(guò) 
   if ((cur->_left == NULL && cur->_right == NULL) || ((PreNode != NULL) && (PreNode == cur->_left || PreNode == cur->_right))) 
   { 
    cout << cur->_data << " "; 
    tty.pop(); 
    PreNode = cur; 
   } 
   else 
   { 
    if (cur->_right != NULL) 
    { 
     tty.push(cur->_right); 
    } 
    if (cur->_left != NULL) 
    { 
     tty.push(cur->_left); 
    } 
   } 
  } 
 } 
 
protected: 
 Node* _root; 
}; 
#include "源.h" 
 
void Test() 
{ 
 int array[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 }; 
 BinaryTree<int> p(array, sizeof(array) / sizeof(array[0]), '#'); 
 cout << "前序遞歸遍歷: " << ""; 
 p.PreOrderR(); 
 cout << endl; 
 
 cout << "前序非遞歸遍歷: " << ""; 
 p.PreOrder(); 
 cout << endl; 
 
 cout << "中序遞歸遍歷: " << ""; 
 p.InOrderR(); 
 cout << endl; 
 
 cout << "中序非遞歸遍歷: " << ""; 
 p.InOrder(); 
 cout << endl; 
 
 cout << "后序遞歸遍歷: " << ""; 
 p.PostOrderR(); 
 cout << endl; 
 
 cout << "后序非遞歸遍歷: " << ""; 
 p.PostOrder(); 
 cout << endl; 
} 
 
int main() 
{ 
 Test(); 
 system("pause"); 
 return 0; 
} 


實(shí)現(xiàn)效果:

以上就是數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)的詳解,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++實(shí)現(xiàn)map和set封裝詳解

    C++實(shí)現(xiàn)map和set封裝詳解

    歡迎閱讀本指南,將帶您深入了解C++中map和set的實(shí)現(xiàn)細(xì)節(jié),本文將重點(diǎn)介紹如何使用C++標(biāo)準(zhǔn)庫(kù)中的容器來(lái)優(yōu)化代碼,同時(shí)提供實(shí)用的示例和技巧,無(wú)論您是初學(xué)者還是資深開(kāi)發(fā)者,本指南都將成為您掌握C++中map和set封裝的有力助手,需要的朋友可以參考下
    2024-03-03
  • 順序線(xiàn)性表的代碼實(shí)現(xiàn)方法

    順序線(xiàn)性表的代碼實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇順序線(xiàn)性表的代碼實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • c++輸出斐波那契數(shù)列示例分享

    c++輸出斐波那契數(shù)列示例分享

    這篇文章主要介紹了c++輸出斐波那契數(shù)列示例,需要的朋友可以參考下
    2014-03-03
  • c語(yǔ)言如何設(shè)置隨機(jī)數(shù)及逐行解析

    c語(yǔ)言如何設(shè)置隨機(jī)數(shù)及逐行解析

    在C語(yǔ)言中,rand()函數(shù)可以用來(lái)產(chǎn)生隨機(jī)數(shù),但是這不是真真意義上的隨機(jī)數(shù),是一個(gè)偽隨機(jī)數(shù),下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言如何設(shè)置隨機(jī)數(shù)及逐行解析的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++超詳細(xì)講解RTTI和cast運(yùn)算符的使用

    C++超詳細(xì)講解RTTI和cast運(yùn)算符的使用

    RTTI(Runtime Type Identification)是“運(yùn)行時(shí)類(lèi)型識(shí)別”的意思。C++引入這個(gè)機(jī)制是為了讓程序在運(yùn)行時(shí)能根據(jù)基類(lèi)的指針或引用來(lái)獲得該指針或引用所指的對(duì)象的實(shí)際類(lèi)型,cast強(qiáng)制轉(zhuǎn)換運(yùn)算符是一種特殊的運(yùn)算符,它把一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型
    2022-08-08
  • C語(yǔ)言中變參函數(shù)傳參的實(shí)現(xiàn)示例

    C語(yǔ)言中變參函數(shù)傳參的實(shí)現(xiàn)示例

    本文主要介紹了C語(yǔ)言中變參函數(shù)傳參,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C/C++ 多線(xiàn)程的學(xué)習(xí)心得總結(jié)

    C/C++ 多線(xiàn)程的學(xué)習(xí)心得總結(jié)

    本篇文章是對(duì)C/C++中多線(xiàn)程的學(xué)習(xí)心得總結(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言實(shí)現(xiàn)三子棋小游戲

    C語(yǔ)言實(shí)現(xiàn)三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c++ STL set_difference set_intersection set_union 操作

    c++ STL set_difference set_intersection set_union 操作

    這篇文章主要介紹了c++ STL set_difference set_intersection set_union 操作,需要的朋友可以參考下
    2017-03-03
  • C語(yǔ)言--數(shù)字交換題目詳解

    C語(yǔ)言--數(shù)字交換題目詳解

    本文通過(guò)代碼給大家介紹c語(yǔ)言數(shù)字交換的題目,通過(guò)實(shí)例代碼給大家講解的很詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)c語(yǔ)言感興趣的朋友一起看看吧
    2021-08-08

最新評(píng)論