【数据结构】二叉树!!!
来源:互联网 发布:淘宝先锋乒羽商城 编辑:程序博客网 时间:2024/06/05 15:12
概念:
一颗二叉树是结点的一个有限集合,该集合为空或者是由一个根节点和一个左子树和一个右子树构成的组合。
特点:
每个结点最多有两个子树,每个子树的顺序不能变,份左子树和右子树。
分类:
满二叉树:在一棵树里面每个分支结点都存在左子树和右子树,并且所有的叶子节点都在同一层。
完全二叉树:一棵具有N个结点的二叉树的结构和满二叉树的前N个结点相
二叉树的性质
若二叉树根结点的层数为1,那么这个非空二叉树的第i层最多有2^(i-1)个结点。
若根节点二叉树的深度为1,那么深度为K的二叉树的最大结点数是2^K-1;
对于任何一棵二叉树,如果叶节点个数为N0,度为2的非叶节点的个数为N1,那么N0 = N1+1;
二叉树的基本操作:
二叉树的遍历
前序:
- 先访问根节点—–>左子树 —–>右子树
结果:A B D E C F
中序:
- 左子树—–>访问根结点—– >右子树
结果:D B E A F C
后序:
- 左子树—–>根节点—–>访问右子树
结果:D E B F C A
层序:
- 每一层顺序遍历二叉树
结果:A B C D E F
【二叉树的基本操作代码】
#include<stack>#include<iostream>using namespace std;template<class T>struct TreeNode{ TreeNode() :leftTree(NULL) ,rightTree(NULL) {} TreeNode(T& d) :leftTree(NULL) ,rightTree(NULL) ,data(d) {} TreeNode(const TreeNode& t) :leftTree(t.leftTree) ,rightTree(t.rightTree) ,data(t.data) {} TreeNode<T>* leftTree; TreeNode<T>* rightTree; T data;};template<class T>class BinaryTree{ typedef TreeNode<T> Node; public: BinaryTree(T* arr,size_t N,T& invalid) //construct function :_root(NULL) { if(arr) { size_t index = 0; _root = GreatTreeNode(_root,arr,N,index,invalid); } } BinaryTree(BinaryTree<T>& t) //copy construction { _root = _CopyTree(t._root); } Node* _CopyTree(Node *root2) //copy tree { if(NULL == root2) return NULL; Node* root1 = new Node(root2->data); root1->leftTree = _CopyTree(root2->leftTree); root1->rightTree = _CopyTree(root2->rightTree); return root1; } void PrePrint() //print by front { _PrePrint(_root); } void _PrePrint(Node* root) { if(NULL == root) return ; cout<<root->data<<" "; _PrePrint(root->leftTree); _PrePrint(root->rightTree); //cout<<endl; } void PreOrder() { if(NULL == _root) return ; stack<Node*> s; s.push(_root); Node* tmp = _root; while(!s.empty()) { tmp = s.top(); s.pop(); while(tmp) { cout<<tmp->data<<" "; if(tmp->rightTree) s.push(tmp->rightTree); tmp = tmp->leftTree; } } } void Inorder() { if(NULL == _root) return ; stack<Node*> s; Node *tmp = _root; while(!s.empty()) { while(tmp) { s.push(tmp); tmp = tmp->leftTree; } tmp = s.top(); cout<<tmp->data<<" "; s.pop(); tmp = tmp->rightTree; } } void BackOrder() { if(NULL == _root) return ; stack<Node*> s; Node* tmp = _root; Node* flag = NULL; s.push(_root); while(!s.empty()||tmp) { while(tmp) { if(tmp->leftTree) s.push(tmp->leftTree); tmp = tmp->leftTree; } tmp = s.top(); if(NULL == tmp->rightTree || flag == tmp->rightTree) { cout<<tmp->data<<" "; s.pop(); flag = tmp; tmp = NULL; } else tmp = tmp->rightTree; } }/* void PreOrder_NoR() //非递归前序遍历 { if(NULL == _root) return ; stack<Node*> s; s.push(_root); while(!s.empty()) { Node* tmp = s.top(); s.pop(); while(tmp) { cout<<tmp->data<<" "; if(tmp->rightTree) s.push(tmp->rightTree); tmp = tmp->leftTree; } } } void InOrder() //非递归中序遍历 { if(NULL == _root) return ; stack<Node*> s; Node*tmp = _root; while(!s.empty()||tmp) { while(tmp) { s.push(tmp); tmp = tmp->leftTree; } tmp = s.top(); s.pop(); cout<<tmp->data<<" "; tmp = tmp->rightTree; } } void BackOrder() //非递归后序遍历 { if(NULL == _root) return ; stack<Node*> s; Node* tmp = _root; Node* flag = NULL; while(!s.empty()||tmp) { while(tmp) { s.push(tmp); tmp = tmp->leftTree; } tmp = s.top(); if(NULL == tmp->rightTree || flag == tmp->rightTree) { cout<<tmp->data<<" "; flag = tmp; s.pop(); tmp = NULL; } else tmp = tmp->rightTree; } }*/ void MidPrint() //Print by mid { _MidPrint(_root); } void _MidPrint(Node *root) { if(NULL == root) return ; _MidPrint(root->leftTree); cout<<root->data<<" "; _MidPrint(root->rightTree); } void BackPrint() //Print by back { _BackPrint(_root); } void _BackPrint(Node * root) { if(NULL == root) return ; _BackPrint(root->leftTree); _BackPrint(root->rightTree); cout<<root->data<<" "; } void FloorPrint() // { if(_root == NULL) return ; stack<Node*> s; s.push(_root); while(!s.empty()) { Node* front = s.top(); s.pop(); cout<<front->data<<" "; if(front->leftTree) s.push(front->leftTree); if(front->rightTree) s.push(front->rightTree); } } size_t DepthOfTree() //Get tree depth { return _DepthOfTree(_root); } size_t _DepthOfTree(Node* root) { if(NULL == root) return 0; size_t leftdepth = _DepthOfTree(root->leftTree); size_t rightdepth = _DepthOfTree(root->rightTree); return leftdepth > rightdepth ? (leftdepth+1):(rightdepth + 1); } size_t leafOfKfloorTree(size_t k) //Find K floor Node { size_t leafnum = 0; return _leafOfKfloorTree(_root,k,leafnum); } size_t _leafOfKfloorTree(Node *root,size_t& k,size_t leafnum) { if(NULL == root) return 0; static size_t num = 0; if(leafnum == k) { ++num; return num; } _leafOfKfloorTree(root->leftTree,k,leafnum+1); _leafOfKfloorTree(root->rightTree,k,leafnum+1); return num; } size_t GetLeafNum() { return _GetLeafNum(_root); } size_t _GetLeafNum(Node* root) { if(NULL == root) return 0; if(NULL == root->leftTree&&NULL == root->rightTree) return 1; size_t leftNum = _GetLeafNum(root->leftTree); size_t rightNum = _GetLeafNum(root->rightTree); return leftNum + rightNum; } size_t leafNum() //Get Tree leaf count { return _leafNum(_root); } size_t _leafNum(Node *root) { if(NULL == root) return 0; return _leafNum(root->leftTree) + _leafNum(root->rightTree) + 1; } Node* Find(T& d) //Find object data { return _Find(_root,d); } Node * _Find(Node *root,T& d) { if(NULL == root) return NULL; if(root->data == d) return root; Node* tmp = _Find(root->leftTree,d); if(tmp) return tmp; return _Find(root->rightTree,d); } Node* leftchild(Node* pos) //Get left child Node { return _leftchild(_root,pos); } Node* _leftchild(Node* root,Node* pos) { if(NULL == root||pos == NULL) return NULL; return pos->leftchild; } Node* rightchild(Node* pos) //Get right child node { return _rightchild(_root,pos); } Node* _rightchild(Node* root,Node* pos) { if(NULL == root||NULL == pos) return NULL; return pos->rightTree; } Node* ParentNode(Node* pos) //Get parent Node { return _ParentNode(_root,pos); } Node* _ParentNode(Node* root,Node* pos) { if(NULL == root||NULL == pos) return NULL; if(root->leftTree == pos||root->rightTree == pos) return root; Node* tmp = _ParentNode(root->leftTree,pos); if(tmp) return tmp; return _ParentNode(root->rightTree,pos); } size_t Size() //Get Tree node count { return _Size(_root); } size_t _Size(Node* root) { if(NULL == root) return 0; return _Size(root->leftTree) + _Size(root->rightTree) + 1; } BinaryTree& operator=(const BinaryTree& b) { if(this != &b) { DestoryTree(_root); _root = _CopyTree(b._root); } return *this; } ~BinaryTree() { DestoryTree(_root); } private: void DestoryTree(Node *del) { if(NULL == del) return ; DestoryTree(del->leftTree); DestoryTree(del->rightTree); delete del; del = NULL; } Node* GreatTreeNode(Node* root,T* arr,size_t N,size_t& index,T& invalid) { root = NULL; if(index < N && arr[index] != invalid) { root = new Node(arr[index]); root->leftTree = GreatTreeNode(root,arr,N,++index,invalid); root->rightTree = GreatTreeNode(root,arr,N,++index,invalid); } return root; } Node *_root;};
阅读全文
0 0
- 数据结构-树-二叉树
- 数据结构::树,二叉树
- 数据结构-二叉树
- 二叉树的数据结构
- 数据结构-二叉树算法
- java数据结构:二叉树
- 数据结构---二叉树
- 数据结构(C++)--二叉树
- JAVA 数据结构 二叉树
- 数据结构-二叉树 问题
- 转贴:数据结构:二叉树
- 二叉树(数据结构 c++)
- 数据结构-二叉树操作
- java数据结构----二叉树
- 数据结构二叉树
- 数据结构中的二叉树
- 数据结构--二叉树
- 数据结构二叉搜索树
- Java中的控制语句
- jsp页面利用get方式提交到后台的数据为乱码格式的解决办法
- 面向对象(下)
- vim中末行去掉^M
- 无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Ex
- 【数据结构】二叉树!!!
- VTK学习-坐标系统
- 【学以致用】android功能实现3---UIautomator 2.0(2)
- glide框架的简单使用
- 欢迎使用CSDN-markdown编辑器
- 语法制导的翻译
- Greendao的配置
- 文章资料汇总整理
- Pyhton 的一些注意点