91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中數據結構二叉樹的示例分析

發布時間:2021-07-24 14:42:51 來源:億速云 閱讀:164 作者:小新 欄目:編程語言

小編給大家分享一下C++中數據結構二叉樹的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

C++ 數據結構二叉樹

二叉樹的性質:

二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。

例:

C++中數據結構二叉樹的示例分析

C++中數據結構二叉樹的示例分析

實例代碼:

#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: 
 //建樹 arr:建樹使用的數組 n:數組大小 invalid:非法值 index:當前下標 
 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]); //根節點 
   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; 
   } 
   //此時出了循環走到了最左葉子節點 
   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; //上一個訪問的結點 
  tty.push(root); 
  while (!tty.empty()) 
  { 
   Node* cur = tty.top(); 
   //訪問的當前節點左右孩子均為空或者當前節點左右子樹均已經訪問過 
   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; 
}

實現效果:

C++中數據結構二叉樹的示例分析

以上是“C++中數據結構二叉樹的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

惠来县| 剑阁县| 松桃| 双城市| 黎城县| 宜兴市| 连江县| 芮城县| 呈贡县| 定南县| 中西区| 张家界市| 读书| 鄂托克前旗| 双柏县| 盐池县| 和林格尔县| 龙口市| 桐乡市| 巩义市| 余干县| 固镇县| 黄山市| 河曲县| 榕江县| 安庆市| 科技| 垫江县| 平江县| 丰城市| 昌黎县| 措美县| 石门县| 双江| 北安市| 正定县| 禹州市| 武功县| 鹤岗市| 井冈山市| 荃湾区|