C++資料結構 16 二叉樹
阿新 • • 發佈:2018-11-24
樹集成了陣列和連結串列的優點(查詢速度快)
樹:結點,度,葉結點,父結點,子結點,兄弟結點,樹的度,樹的高度。
具體概念可以參考:https://blog.csdn.net/u012928324/article/details/61194190?utm_source=itdadao&utm_medium=referral
#ifndef _BinaryTree_H__ #define _BinaryTree_H__ #include<iostream> #include <queue> using namespace std; template<class T> class Binary_Tree; template <class T> class TreeNode //樹節點 { public: TreeNode() { leftchild=rightchild=NULL; } T data; //資料 TreeNode<T>* leftchild; //左孩子 TreeNode<T>*rightchild; //右孩子 }; template <class T> class Binary_Tree //樹 { public: void InOrder(); //中序遍歷 左子樹-節點-右子樹 void PreOrder(); //前序遍歷 節點-左子樹-右子樹 void PostOrder(); //後序遍歷 左子樹-右子樹-節點 void LevelOrder(); //層序遍歷 void InOrder(TreeNode<T>*CurrentNode); //顯示當前節點 void PreOrder(TreeNode<T>*CurrentNode); void PostOrder(TreeNode<T>*CurrentNode); void Vivit(TreeNode<T>*CurrentNode); TreeNode<T>*root; //根 }; template<class T> void Binary_Tree<T>::InOrder() //中序遍歷 左子樹-節點-右子樹 { InOrder(root); } template<class T> void Binary_Tree<T>::Vivit(TreeNode<T>*CurrentNode)//顯示節點或處理資料 { cout<<CurrentNode->data; } template<class T> void Binary_Tree<T>::InOrder(TreeNode<T>*CurrentNode) { if(CurrentNode) //如果當前節點不為空 { InOrder(CurrentNode->leftchild); //先遍歷左節點 Vivit(CurrentNode); //顯示當前節點 InOrder(CurrentNode->rightchild); //再遍歷右節點 } } template<class T> void Binary_Tree<T>::PreOrder() //前序 { PreOrder(root); } template<class T> void Binary_Tree<T>::PreOrder(TreeNode<T>*CurrentNode)//前序遍歷 { if(CurrentNode) { Vivit(CurrentNode); PreOrder(CurrentNode->leftchild); //左邊 PreOrder(CurrentNode->rightchild); //右邊 } } template<class T> void Binary_Tree<T>::PostOrder() //後序遍歷 { PostOrder(root); } template<class T> void Binary_Tree<T>::PostOrder(TreeNode<T>*CurrentNode)//後序遍歷 { if(CurrentNode) { PostOrder(CurrentNode->leftchild); PostOrder(CurrentNode->rightchild); Vivit(CurrentNode); } } template<class T> void Binary_Tree<T>::LevelOrder() //層序遍歷 { queue<TreeNode<T>*> q; TreeNode<T> *currentNode=root; while(currentNode) { Vivit(currentNode); if(currentNode->leftchild) q.push(currentNode->leftchild); //如果左節點存在,則放入佇列中 if(currentNode->rightchild) q.push(currentNode->rightchild); if(q.empty()) return; //如果為空 則結束 currentNode=q.front(); q.pop(); //刪除顯示出的資料 } } #endif // _BinaryTree_H__
main
#include <iostream> #include "BinaryTree.h" using namespace std; int main() { Binary_Tree<char> P; TreeNode<char> add,sub,mul,div,a,b,c,d,e,tree;; add.data='+'; sub.data='-'; mul.data='*'; div.data='/'; a.data='A'; b.data='B'; c.data='C'; d.data='D'; e.data='E'; P.root=&add; add.leftchild=⊂ add.rightchild=&e; sub.leftchild=&mul; sub.rightchild=&d; mul.leftchild=÷ mul.rightchild=&c; div.leftchild=&a; div.rightchild=&b; cout << "中序遍歷:"; P.InOrder(); //中序遍歷 cout<<endl; // cout << "前序遍歷:"; P.PreOrder(); //中序遍歷 cout<<endl; cout << "後序遍歷:"; P.PostOrder(); //中序遍歷 cout<<endl; cout << "層序遍歷:"; P.LevelOrder(); return 0; }