由于此前已对二叉树介绍过,在此便不多做解释;全是递归操作,先左后右;

创建一个变量:

 BinaryTreeNode<T>* _pRoot;

以下是操作是创建树

 void _CreateTree(Node*& pRoot, const T array[], size_t size, size_t& index, const T& invalid)  //创建一个树{if(index<size&&invalid!=array[index]){pRoot=new Node(array[index]);_CreateTree(pRoot->_pLeft,array,size,++index,invalid);_CreateTree(pRoot->_pRight,array,size,++index,invalid);}}

销毁树

 void _DestroyTree(Node* &pRoot)  //销毁树{Node* temp=pRoot;if(pRoot==NULL){return;}_DestroyTree(temp->_pLeft);_DestroyTree(temp->_pRight);delete temp;temp=NULL;}

前序遍历树

 void _PreOrder(Node* pRoot) //前序遍历{Node* temp=pRoot;if(temp==NULL){return;}cout<<temp->_data<<"  ";//访问跟结点_PreOrder(temp->_pLeft);//递归算法访问左结点_PreOrder(temp->_pRight);//递归算法访问右结点}

中序遍历树

 void _InOrder(Node* pRoot) //中序遍历{Node* temp=pRoot;if(temp==NULL){return;}_InOrder(temp->_pLeft);//递归算法访问左结点cout<<temp->_data<<"  ";//访问跟结点_InOrder(temp->_pRight);//递归算法访问右结点}

后序遍历结点

 void _PostOrder(Node* pRoot)  //后序遍历{Node* temp=pRoot;if(temp==NULL){return;}_PostOrder(temp->_pLeft);//递归算法访问左结点_PostOrder(temp->_pRight);//递归算法访问右结点cout<<temp->_data<<"  ";//访问跟结点}

某结点的双亲结点

  Node* _GetParent(Node* pRoot, Node* x){  if(x==pRoot||x==NULL||NULL==pRoot){return NULL;}if(x==pRoot->_pLeft||x==pRoot->_pRight){return pRoot;}if(x!=pRoot){_GetParent(pRoot->_pLeft,x);_GetParent(pRoot->_pRight,x);}    }

求树的高度

 size_t _Height(Node* pRoot){if(pRoot==NULL)return 0;if(NULL==pRoot->_pLeft&&NULL==pRoot->_pRight)return 1;else{size_t leftHight=_Height(pRoot->_pLeft);size_t rightHight=_Height(pRoot->_pRight);if(leftHight>rightHight)return leftHight+1;elsereturn rightHight+1;}}

树的层数

 size_t _GetKLevelNode(Node* pRoot, size_t k){if(pRoot==NULL||k<1||k>_Height(pRoot))return 0;if(NULL==pRoot->_pLeft&&NULL==pRoot->_pRight)return 1;return  _GetKLevelNode(pRoot->_pLeft,k-1)+ _GetKLevelNode(pRoot->_pRight,k-1);}

树的叶子节点的个数

 size_t _GetLeefNode(Node* pRoot){if(pRoot==NULL)return 0;if(NULL==pRoot->_pLeft&&NULL==pRoot->_pRight)return 1;return   _GetLeefNode(pRoot->_pLeft)+ _GetLeefNode(pRoot->_pRight);}

拷贝构造函数

 Node* _CopyBinaryTree(Node* pRoot)   //复制树{if(pRoot==NULL){return NULL;}Node* pNewRoot=new Node(pRoot->_data);pNewRoot->_pLeft=_CopyBinaryTree( pRoot->_pLeft);pNewRoot->_pRight=_CopyBinaryTree( pRoot->_pRight);return pNewRoot;}

在树中寻找某个结点

 Node* _Find(Node* pRoot, const T& value){Node* pCur=pRoot;Node* P=NULL;if(pCur==NULL){return NULL;}if(value==pCur->_data){P=pCur;}else{P=_Find(pCur->_pLeft,value);if(P==NULL)P=_Find(pCur->_pRight,value);}return P;}

以下是非递归算法:

非递归前序遍历算法:

 void _PreOrder_nor(Node* pRoot){stack<Node*> s;Node* p=pRoot;while(!s.empty()||p!=NULL){while(p){s.push(p);       cout<<p->_data<<"  ";p=p->_pLeft;}   p=s.top();s.pop();p=p->_pRight;}}

非递归中遍历算法:

 //非递归中序遍历:访问左子树-->根-->右子树 void _InOrder_nor(Node* pRoot){stack<Node*> s;Node* p=pRoot;while(!s.empty()||p!=NULL){while(p){s.push(p);p=p->_pLeft;}   p=s.top();s.pop();cout<<p->_data<<"  ";p=p->_pRight;}}

非递归后序遍历算法:

 // 非递归后续遍历:访问左子树-->访问右子树-->访问根节点void _PostOrder_nor(Node* pRoot){if(NULL==pRoot) //空树return;Node* PCur=pRoot; //当前结点为根节点Node* Prev=NULL;  //已经访问的结点stack<Node*> s;while(!s.empty()||PCur){while(PCur)    //把左孩子依次压栈{s.push(PCur);PCur=PCur->_pLeft;}//当前结点为NULLNode* top=s.top();  //指向栈顶if(NULL==top->_pRight||Prev==top->_pRight)  //栈顶元素没有右孩子,或者右孩子已经被访问过{cout<<top->_data<<"";Prev = top;   //已经访问的结点s.pop();}elsePCur=top->_pRight;}}

二叉树的操作--递归与非递归相关推荐

  1. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  2. 剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)

    1 问题 判断二叉树是不是对称(递归和非递归实现) 如下二叉树,就是对称的二叉树 23 3 1 4 4 1 如下二叉树,就是非对称的二叉树 23 3 1 4 4 2 2 代码实现 #include & ...

  3. 二叉树的遍历-递归与非递归 - 海子

    二叉树的遍历-递归与非递归 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方 ...

  4. c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)

    五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...

  5. 有关二叉树的相关实现:建树,遍历(递归与非递归实现)

    首先定义二叉树的节点 struct BTNode {int data;BTNode *left;BTNode *right; }; 然后先序建立二叉树 思路:以数组中的元素先序构建二叉树,过程就是不断 ...

  6. java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法

    题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...

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

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

  8. 二叉树的三种遍历方式(递归、非递归和Morris遍历)

    二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...

  9. 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...

  10. C语言实现二叉树前序中序后序递归与非递归遍历、层次遍历、二叉树带权路径长度

    用C语言实现了二叉树的初始化,循环队列与顺序栈的建立. 利用递归与非递归方式实现前序遍历.中序遍历.后序遍历. 利用队列实现了层次遍历. 求得了二叉树带权路径长度 #include<stdio. ...

最新文章

  1. 及cp含义_当我们谈论CP时,我们在谈论什么?
  2. 超级干货丨优美的课程笔记,吴恩达点赞的深度学习课程信息图
  3. 数据结构实验之二叉树八:(中序后序)求二叉树的深度
  4. linux命令 -- split命令
  5. 7000p壁纸怎么换_这些圣诞壁纸,劝你们马上点开,保存!真的超好看
  6. Spring3 MVC Login Interceptor(Spring 拦截器)
  7. 泛化,过拟合,欠拟合素材(part2)--机器学习入门之道
  8. sde用户下使用sqlplus登录错误ORA-12547: TNS:lost contact
  9. 登录后 可编辑页面 php,如何查找和编辑登录的php页面以及更改详细信息 - WordPress - srcmini...
  10. php接口三结构,grape动态PHP结构(三)——API接口
  11. 解决 ElementUI form表单在dialog中重置表单,无法正确重置的问题
  12. Tomcat8.5后版本不返回200 OK的问题解决
  13. 2021年高处安装、维护、拆除考试试卷及高处安装、维护、拆除操作证考试
  14. 一个基本c语言注释用什么字符串,C语言的词法规则京鸿智武 今天提纲:本文主要介绍了C语言中...
  15. MTTF,MTBF,MTTF
  16. expect结合scp实现文件上传
  17. Linux刻录光盘win10认不到,Win10不能读取DVD光驱和刻录光盘解决方法
  18. 消费管理系统java代码_SSH框架+Mysql数据库开发java web会员积分消费管理系统
  19. VTK可交互三维坐标轴
  20. JAVA 黑马学习笔记记录 for switch while do...while

热门文章

  1. jsp servlet mysql实现的java学生选课系统源码附带高清视频指导运行教程及论文
  2. ❤️Java17 发布了,YYDS!重磅!Oracle 宣布 JDK 17 可以免费商用了。。
  3. 使用Python制作专属微信小客服
  4. ionic3 css判断设备,第十三讲 ionic css布局介绍
  5. karabiner-elements
  6. macOS键盘定制神器Karabiner Elements
  7. shell运行python脚本报错没有包_脚本安装Discuz论坛(shell + Python 实现自动化安装)...
  8. matlab隐函数显化,怎么把隐函数显化
  9. vue2.0分页插件官方_Vue 2的最佳和完整分页插件
  10. 发外链的平台有哪些,分享六个免费发外链的平台