【数据结构】二叉树的简单遍历及基本操作

来源:互联网 发布:淘宝女士秋季连衣裙 编辑:程序博客网 时间:2024/04/29 04:52

1、构造

2、拷贝构造

3、析构

4.深度

5、叶子数

6.前序遍历递归非递归

7、中序遍历递归非递归

8、中序遍历递归非递归

9、第k层子树

定义树节点结构体

struct BinTreeNode{BinTreeNode* left;BinTreeNode* right;T _date;BinTreeNode(const T& x):left(NULL),right(NULL),_date(x){}};


内部函数实现

void _CreateTree(Node*& root,T a[],size_t size,int& index ,const T& invalid){if(index< size&& a[index]!=invalid){root=new Node(a[index]);_CreateTree(root->left,a,size,++index,invalid);_CreateTree(root->right,a,size,++index,invalid);}}Node*  _CopyBinTree(Node* root){Node* newNode=NULL;if(!root){        newNode=new Node(root->_date);newNode->left=_CopyBinTree(root->left);newNode->right=_CopyBinTree(root->right);}return newNode;}void  _Destory(Node* root){if(root==NULL)return;_Destory(root->left);_Destory(root->right);delete root;}void  _PrevOrder(Node* root){if(root==NULL)return;        cout<<root->_date<<" ";_PrevOrder(root->left);_PrevOrder(root->right);}void  _InOrder(Node* root){if(root==NULL)return;_InOrder(root->left);         cout<<root->_date<<" ";_InOrder(root->right);}void  _PostOrder(Node* root){if(!root)return;_PostOrder(root->left);_PostOrder(root->right);cout<<root->_date<<" ";}int _Size(Node* root){if (!root)return 0;return _Size(root->left)+_Size(root->right)+1;}int _Depth(Node* root){if(!root)return 0;int leftchilddepth=_Depth(root->left)+1;int rightchilddepth=_Depth(root->right)+1;if(leftchilddepth>=rightchilddepth){return leftchilddepth;}else{return rightchilddepth;}}int _GetKLevel(Node* root,size_t k){if(root==NULL)return 0;if(k==1)return 1;else return _GetKLevel(root->left,k-1)+_GetKLevel(root->right,k-1);}int _LeafSize(Node* root){if(root==NULL)return 0;if(root->left==NULL&&root->right==NULL)return 1;return _LeafSize(root->left)+_LeafSize(root->right);}
外部实现调用内部函数

BinTree(T* a,size_t size,const T& invalid)//构造{int index=0;_CreateTree( _root,a,size,index,invalid);}BinTree(const BinTree<T>& t)//拷贝构造{_root=_CopyBinTree(t._root);}BinTree<T>& operator=(const BinTree<T> &t)//运算符重载{if(this!=&t){swap(_root=t._root);}return *this;}void PrevOrder()//递归前序{_PrevOrder(_root);cout<<endl;}void InOrder(){_InOrder(_root);cout<<endl;}void PostOrder(){_PostOrder(_root);cout<<endl;}void LevelOrder()///层序{queue<Node*> q;Node* cur=_root;if(cur)q.push(cur);while (!q.empty()){cur=q.front();cout<<cur->_date<<" ";if(cur->left){q.push(cur->left);}if(cur->right){q.push(cur->right);}q.pop();}cout<<endl;}void PrevOrder_NonR()//非递归前序{stack<Node*> sn;if(_root){sn.push(_root);}while (sn.empty()==NULL){Node* root=sn.top();cout<<root->_date<<" ";sn.pop();if (root->left){sn.push(root->left);}    if (root->right){sn.push(root->right);}}cout<<endl;}void InOrder_NonR(){stack<Node*> sn;Node* cur=_root;while (cur||!sn.empty()){while (cur){sn.push(cur);cur=cur->left;}if (!sn.empty()){Node* tmp=sn.top();cout<<tmp->_date<<" ";sn.pop();cur=tmp->right;}}cout<<endl;}void PostOrder_NonR() {stack<Node*> s;Node *cur; Node *pre=NULL; s.push(_root);while(!s.empty()){cur=s.top();if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right))){cout<<cur->_date<<" "; s.pop();pre=cur; }else{if(cur->right!=NULL)s.push(cur->right);if(cur->left!=NULL) s.push(cur->left);}} cout<<endl;}size_t Size(){return _Size(_root);}size_t Depth(){return _Depth(_root);}size_t LeafSize(){return _LeafSize(_root);}size_t GetKLevel(size_t k){return _GetKLevel(_root,k);}void Destory(){_Destory(_root);}
测试用例

void test(){int a1[10]={1,2,3,'#','#',4,'#','#',5,6};BinTree<int> t1(a1,10,'#');t1.PrevOrder();t1.InOrder();t1.PostOrder();t1.PrevOrder_NonR();t1.InOrder_NonR();t1.PostOrder_NonR();t1.LevelOrder();cout<<t1.Size()<<endl;cout<<t1.Depth()<<endl;cout<<t1.LeafSize()<<endl;cout<<t1.GetKLevel(2);}
源码

#include <iostream>#include <cstdlib>#include <assert.h>#include <stack>#include<queue>using namespace std;template<typename T>struct BinTreeNode{BinTreeNode* left;BinTreeNode* right;T _date;BinTreeNode(const T& x):left(NULL),right(NULL),_date(x){}};template<typename T>class BinTree{typedef BinTreeNode<T> Node;public:BinTree():_root(NULL){}~BinTree(){Destory();}BinTree(T* a,size_t size,const T& invalid){int index=0;_CreateTree( _root,a,size,index,invalid);}BinTree(const BinTree<T>& t){_root=_CopyBinTree(t._root);}BinTree<T>& operator=(const BinTree<T> &t){if(this!=&t){swap(_root=t._root);}return *this;}void PrevOrder(){_PrevOrder(_root);cout<<endl;}void InOrder(){_InOrder(_root);cout<<endl;}void PostOrder(){_PostOrder(_root);cout<<endl;}void LevelOrder(){queue<Node*> q;Node* cur=_root;if(cur)q.push(cur);while (!q.empty()){cur=q.front();cout<<cur->_date<<" ";if(cur->left){q.push(cur->left);}if(cur->right){q.push(cur->right);}q.pop();}cout<<endl;}void PrevOrder_NonR(){stack<Node*> sn;if(_root){sn.push(_root);}while (sn.empty()==NULL){Node* root=sn.top();cout<<root->_date<<" ";sn.pop();if (root->left){sn.push(root->left);}    if (root->right){sn.push(root->right);}}cout<<endl;}void InOrder_NonR(){stack<Node*> sn;Node* cur=_root;while (cur||!sn.empty()){while (cur){sn.push(cur);cur=cur->left;}if (!sn.empty()){Node* tmp=sn.top();cout<<tmp->_date<<" ";sn.pop();cur=tmp->right;}}cout<<endl;}void PostOrder_NonR() {stack<Node*> s;Node *cur; Node *pre=NULL; s.push(_root);while(!s.empty()){cur=s.top();if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right))){cout<<cur->_date<<" "; s.pop();pre=cur; }else{if(cur->right!=NULL)s.push(cur->right);if(cur->left!=NULL) s.push(cur->left);}} cout<<endl;}size_t Size(){return _Size(_root);}size_t Depth(){return _Depth(_root);}size_t LeafSize(){return _LeafSize(_root);}size_t GetKLevel(size_t k){return _GetKLevel(_root,k);}void Destory(){_Destory(_root);}protected:void _CreateTree(Node*& root,T a[],size_t size,int& index ,const T& invalid){if(index< size&& a[index]!=invalid){root=new Node(a[index]);_CreateTree(root->left,a,size,++index,invalid);_CreateTree(root->right,a,size,++index,invalid);}}Node*  _CopyBinTree(Node* root){Node* newNode=NULL;if(!root){        newNode=new Node(root->_date);newNode->left=_CopyBinTree(root->left);newNode->right=_CopyBinTree(root->right);}return newNode;}void  _Destory(Node* root){if(!root)return;_Destory(root->left);_Destory(root->right);delete root;}void  _PrevOrder(Node* root){if(root==NULL)return;        cout<<root->_date<<" ";_PrevOrder(root->left);_PrevOrder(root->right);}void  _InOrder(Node* root){if(root==NULL)return;_InOrder(root->left);         cout<<root->_date<<" ";_InOrder(root->right);}void  _PostOrder(Node* root){if(!root)return;_PostOrder(root->left);_PostOrder(root->right);cout<<root->_date<<" ";}int _Size(Node* root){if (!root)return 0;return _Size(root->left)+_Size(root->right)+1;}int _Depth(Node* root){if(!root)return 0;int leftchilddepth=_Depth(root->left)+1;int rightchilddepth=_Depth(root->right)+1;if(leftchilddepth>=rightchilddepth){return leftchilddepth;}else{return rightchilddepth;}}int _GetKLevel(Node* root,size_t k){if(root==NULL)return 0;if(k==1)return 1;else return _GetKLevel(root->left,k-1)+_GetKLevel(root->right,k-1);}int _LeafSize(Node* root){if(root==NULL)return 0;if(root->left==NULL&&root->right==NULL)return 1;return _LeafSize(root->left)+_LeafSize(root->right);}Node* _root;};void test(){int a1[10]={1,2,3,'#','#',4,'#','#',5,6};BinTree<int> t1(a1,10,'#');t1.PrevOrder();t1.InOrder();t1.PostOrder();t1.PrevOrder_NonR();t1.InOrder_NonR();t1.PostOrder_NonR();t1.LevelOrder();cout<<t1.Size()<<endl;cout<<t1.Depth()<<endl;cout<<t1.LeafSize()<<endl;cout<<t1.GetKLevel(2);}
<pre name="code" class="cpp">void test2(){   int array1[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 };   BinTree<int> tree(array1,10,'#');  BinTree<int> tree1=tree;//拷贝   tree1.PrevOrder(); }



主函数

#include "BinTree.h"int main(){<span style="white-space:pre"></span>test();<span style="white-space:pre"></span>test2();<span style="white-space:pre"></span>system("pause");<span style="white-space:pre"></span>return 0;}






0 0
原创粉丝点击