二叉树:每个节点最多两个孩子节点。

二叉树的结构:         struct TreeNode

{

DataType _value;     //节点值

TreeNode*  _left;    //左孩子

TreeNode*  _ridht;   //右孩子

};

二叉树的基础:        构造、拷贝构造、析构、赋值运算符的重载

二叉树的知识点:      高度、节点的个数、子节点的个数

二叉树的遍历:        前序、中序、后序遍历(递归及非递归)

遍历顺序:            前序——根左右          中序——左根右          后序——左右根

注意: 递归遍历时,应该注意不要出现栈溢出现象。

因为++index返回对象,index++返回临时变量,所以传引用做参数时有++index。

#pragma once#include<queue>
#include<stack>//二叉树的结构
template<class T>
struct BinaryTreeNode
{BinaryTreeNode<T>* _left;BinaryTreeNode<T>* _right;T _data;//构造函数BinaryTreeNode(const T& x):_left(NULL), _right(NULL), _data(x){}
};
template<class T>
class BinaryTree
{typedef BinaryTreeNode<T> Node;  public://构造BinaryTree():_root(NULL){}// a--树的节点前序遍历的数组  size--数组中元素个数  invaild--无效值即节点为空BinaryTree(const T* a,size_t size,const T& invalid){size_t index = 0;_root = _CreateTree(a, size,invalid,index);}//析构~BinaryTree(){_Destory(_root);_root = NULL;}//拷贝  BinaryTree(const BinaryTree<T>& t){_root = _Copy(t._root);}//赋值重载(传统)//BinaryTree<T>& operator=(const BinaryTree<T>& t)//{//  if (this != &t)//  {//     Node* tmp = _Copy(t._root);//      _Destory(_root);//      _root = tmp;// }// return *this;//}//赋值重载(现代)BinaryTree<T>& operator=(BinaryTree<T> t){swap(_root, t._root);return *this;}T& operator->(){return _root;}public:void PrevOrder()//前序{_PrevOrder(_root);cout << endl;}void InOrder()//中序{_InOrder(_root);cout << endl;}void PostOrder()//后序{_PostOrder(_root);cout << endl;}size_t Size()  //节点个数{return _Size(_root);}size_t Depth()  //树的深度{return _Depth(_root);}size_t LeafSize()  //叶子节点个数{return _LeafSize(_root);}//层次遍历void LevelOrder(){queue<Node*> q;if (_root){q.push(_root);}while (!q.empty()){Node* front = q.front();cout << front->_data << " ";q.pop();if (front->_left){q.push(front->_left);}if (front->_right){q.push(front->_right);}}cout << endl;}
public://非递归的前中后序遍历(栈)void PrevOrder_NonR(){stack<Node*> s;if (_root)s.push(_root);while (!s.empty()){Node* top = s.top();cout << top->_data << " ";s.pop();//栈后进先出  ,所以 右先进,左先出if (top->_right)s.push(top->_right);if (top->_left)s.push(top->_left);}cout << endl;}void InOrder_NonR(){//压左树//取出一个节点即它的左路走完了,在访问右树(看作子问题)stack<Node*> s;Node* cur = _root;while (cur || !s.empty()){//压树的左路节点直至最左段节点while (cur){s.push(cur);cur = cur->_left;}if (!s.empty()){Node* top = s.top();s.pop();cout << top->_data << " ";cur=top->_right;}}cout << endl;}void PostOrder_NonR(){Node* prev = NULL;Node* cur = _root;stack<Node*> s;while (cur || !s.empty()){//压树的左路节点直至最左段节点while (cur){s.push(cur);cur = cur->_left;}Node* top = s.top();if (top->_right == NULL || top->_right == prev){cout << top->_data << " ";s.pop();prev = top;}else{cur = top->_right;}}cout << endl;}protected://注意 此处index要用引用传参Node* _CreateTree(const T* a, size_t size, const T& invalid, size_t& index) {Node* root = NULL;if ((index < size) && (a[index] != invalid)){root = new Node(a[index]);//注意下面只能用++index。此处传的是引用 //因为++index返回对象,index++返回临时变量。root->_left = _CreateTree(a, size, invalid, ++index);root->_right = _CreateTree(a, size, invalid, ++index);}return root;}void _Destory(Node* root){if (root == NULL)return;_Destroy(root->_left);_Destroy(root->_right);delete root;}Node* _Copy(Node* root){if (root == NULL)return NULL;NOde* newRoot = new Node(root->_data);newRoot->_left = _Copy(root->_left);newRoot->_right = _Copy(root->_right);return newRoot;}//void _PrevOrder(Node* root){if (root == NULL)return;cout << root->_data << " ";_PrevOrder(root->_left);_PrevOrder(root->_right);}void _InOrder(Node* root){if (root == NULL)return;_InOrder(root->_left);cout << root->_data << " ";_InOrder(root->_right);}void _PostOrder(Node* root){if (root == NULL)return;_PostOrder(root->_left);_PostOrder(root->_right);cout << root->_data << " ";}size_t _Size(Node* root){if (root == NULL)return 0;return (_Size(root->_left) + _Size(root->_right) + 1);}size_t _Depth(Node* root){if (root == NULL)return 0;size_t LeftDepth = _Depth(root->_left);size_t RightDepth = _Depth(root->_right);return (LeftDepth > RightDepth) ? (LeftDepth + 1) : (RightDepth + 1);}size_t _LeafSize(Node* root){if (root == NULL)return 0;if ((root->_left == NULL) && (root->_right == NULL))return 1;return (_LeafSize(root->_left) + _LeafSize(root->_right));}
private:Node *_root;
};

转载于:https://blog.51cto.com/1536262434/1786588

【C++】 二叉树的基本知识及其遍历相关推荐

  1. 二叉树总结(二)树的遍历

    该文我会用来总结二叉树相关的知识 二叉树如下图: 二叉树的结构 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int ...

  2. 建立二叉树:已知层次遍历顺序建立二叉树、已知先序遍历顺序建立二叉树

    其他二叉树知识!二叉树知识汇总 目录 前提知识: 约定: 二叉树节点的存储结构: 创建一个节点: 建立二叉树的几种方法: 一.已知先序遍历顺序,构建二叉树.(链式存储) 二.已知层次遍历顺序,构建二叉 ...

  3. 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现

    二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现 提示:今天开始,系列二叉树的重磅基础知识和大厂高频面试题就要出炉了,咱们慢慢捋清楚! 文章目录 二叉树,二叉树的归先序遍历,中序遍历, ...

  4. 二叉树的建立及层次遍历(自下而上,自左而右输出)

    给定一颗二叉树,要求从下至上按层遍历二叉树,每层的访问顺序是从左到右,每一层单独输出一行. 这道题目是数据结构初学者最头疼的题目之一.二叉树.c语言的灵魂和难点都在指针,而想要这里的二叉树实现的好,指 ...

  5. 二叉树非递归先序遍历

    二叉树的递归先序遍历很简单,假设二叉树的结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 ...

  6. 常考数据结构与算法:二叉树的之字形层序遍历

    题目描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树之字形层序遍历的结果是 [ ...

  7. Python实现二叉树的三种深度遍历方法!

    python代码实现了二叉树,这次将会实现二叉树的几种遍历方法,来更好的解析二叉树的结构特点.分别是一种广度遍历,和三种深度遍历方法:先序遍历,中序遍历,后序遍历.下面是代码实现: 1.先序遍历 遍历 ...

  8. LeetCode Algorithm 103. 二叉树的锯齿形层序遍历

    103. 二叉树的锯齿形层序遍历 Ideas 首先得理解二叉树的层序遍历,它类似于广度优先搜索,在当前层搜索的时候,遍历到的每一个节点都要把它的所有孩子节点都添加到队列中. 然后我们要锯齿形遍历,可以 ...

  9. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

最新文章

  1. mysql reverse 索引_降序索引和减轻索引扫描
  2. CloudStack管理员文档 - 虚拟机
  3. 使用split进行分割时遇到特殊字符的问题
  4. 一定要树立真的猛的期刊,只需要发一篇的思路
  5. 深度学习笔记第一门课第一周:深度学习引言
  6. 分布式版本控制系统Mercurial(一):Mercurial基本功能介绍
  7. 计算机技术应用广泛 属于科学计算方面的是,中国大学MOOC: 计算机技术应用广泛,以下属于科学计算方面的是哪个? 答案:火箭轨道计算...
  8. 下如何查看mysql表单_Navicat 教程:如何进行表单查看
  9. 金山云笔试题:AKM函数
  10. 敏捷思维- 架构设计中的方法学(1)
  11. 061 面向过程编程
  12. windows office visio各版本下载
  13. VM虚拟机安装CentOS 7详解
  14. python坦克大战游戏_python实现坦克大战游戏
  15. 每日一学18——凉鞋的简易有限状态机
  16. 华为android o适配名单,华为给出首批升级名单,这8款华为手机率先适配Android Q 10系统...
  17. 城市夜空三(续)公布聊天记录第一部分
  18. sonique的插件Dee2
  19. 苹果一体机卸载原装OSX系统,只安装win10系统操作过程2019-11
  20. 全方位体验Windows的日历功能

热门文章

  1. 怎么查交集_胃镜要不要查?
  2. 黑客大神用什么杀毒?Windows自带的就够,只是加了亿点微小的强化
  3. 程序员离职删代码被判10个月,京东到家说恢复数据库花了3万,网友:这是真有仇啊...
  4. “AI理论之父应该是哥德尔”,LSTM之父再抛惊人观点,网友:他有点走火入魔...
  5. 4个轮子+1部手机=长城眼里的智能汽车现状
  6. AI「复活」《延禧攻略》众生相
  7. 清华类脑计算成果再登Nature:张悠慧施路平团队出品,有望打破冯诺依曼瓶颈...
  8. Rabbitmq基本框架和安装(1)
  9. MyEclipse修改jsp模板文件
  10. Tengine 安装和基本使用