【数据结构】二叉树的简单遍历及基本操作
来源:互联网 发布:淘宝女士秋季连衣裙 编辑:程序博客网 时间: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
- 【数据结构】二叉树的简单遍历及基本操作
- 二叉树的基本操作及遍历
- 数据结构(十二) 二叉树的基本操作 --- 创建一个二叉树 前中后序遍历二叉树
- 二叉树基本操作及层次遍历
- 【数据结构】二叉树的简单操作及简单应用
- 数据结构类型定义及基本操作汇总(二)-- 二叉树及其遍历
- javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作
- 数据结构编程笔记十四:第六章 树和二叉树 二叉树基本操作及四种遍历算法的实现
- 二叉树的数据结构及遍历
- 二叉树的基本操作和遍历
- 二叉树的基本操作(定义、遍历、高度、生成)【数据结构】
- 数据结构之二叉树的基本操作
- 【数据结构】二叉树的基本操作
- (数据结构)二叉树的基本操作
- 【数据结构笔记】二叉树的基本操作
- 数据结构-二叉树的基本操作
- 数据结构->二叉树的基本操作
- 二叉数的递归遍历及基本操作
- android画弧线canvas.drawArc()参数详解
- MDCC2016 ppt等相关学习资料
- 29.angular的从后台获取数据的方法http模块
- Android Shape自定义纯色圆角按钮
- 第七章 作用域和闭包
- 【数据结构】二叉树的简单遍历及基本操作
- hdu 5117 Fluorescent (求期望 + DP)
- mysql bin-log日志处理详解
- 【php】正则表达式提取img的src
- 三张图讲清楚Java中的方法的参数传递机制
- 内存泄漏和内存溢出的区别
- 软著中写源代码60页快速实现方法
- impdp之table_exists_action
- 微信小程序开发者文档教程,从入门到精通 (附超过100个完整项目源代码、文档)