C++实现二叉树的相应操作

1. 二叉树的遍历:先序(递归、非递归),中序(递归、非递归),后序(递归、非递归)。

#include <iostream>
#include <string>
#include <stack>using namespace std;struct BiTree
{int NodeData = 0;struct BiTree *pLeft = nullptr;struct BiTree *pRight = nullptr;
};//遍历二叉树:
void show(struct BiTree *pRoot, int n)
{if (pRoot == nullptr){return;}else{show(pRoot->pLeft, n + 1);for (int i = 0; i < n; i++)cout << "   ";cout << pRoot->NodeData << endl;show(pRoot->pRight, n + 1);}}
//--------------------------------------------------------------
//递归中序遍历:
void RecMidTravel(struct BiTree *pRoot)
{if (pRoot == nullptr){return;}else  {if (pRoot->pLeft != nullptr){RecMidTravel(pRoot->pLeft);}cout << pRoot->NodeData << endl;if (pRoot->pRight != nullptr){RecMidTravel(pRoot->pRight);}}
} //中序非递归
void MidTravel(struct BiTree *pRoot)
{if (pRoot == nullptr){return;}else{struct BiTree *pcur = pRoot;stack<BiTree *> mystack;while (!mystack.empty() || pcur != nullptr){while (pcur != nullptr){mystack.push(pcur);pcur = pcur->pLeft;    //左节点全部进栈
            }if (!mystack.empty()){pcur = mystack.top();cout << pcur->NodeData << endl;mystack.pop();                    //出栈pcur = pcur->pRight;            //右节点
            }}}
}
//--------------------------------------------------------------
//递归先序遍历:
void RecPreTravel(struct BiTree *pRoot)
{if (pRoot == nullptr){return;}else{cout << pRoot->NodeData << endl;if (pRoot->pLeft != nullptr){RecPreTravel(pRoot->pLeft);}if (pRoot->pRight != nullptr){RecPreTravel(pRoot->pRight);}}
}
//先序非递归
void PreTravel(struct BiTree *pRoot)
{if (pRoot == nullptr){return;}else{struct BiTree *pcur = pRoot;stack<BiTree *> mystack;while (!mystack.empty() || pcur != nullptr){while (pcur != nullptr){cout << pcur->NodeData << endl;mystack.push(pcur);pcur = pcur->pLeft;    //左节点全部进栈
            }if (!mystack.empty()){pcur = mystack.top();mystack.pop();                    //出栈pcur = pcur->pRight;            //右节点
            }}}
}//--------------------------------------------------------------
//递归后序遍历:
void RecPostTravel(struct BiTree *pRoot)
{if (pRoot == nullptr){return;}else{if (pRoot->pLeft != nullptr){RecPostTravel(pRoot->pLeft);}if (pRoot->pRight != nullptr){RecPostTravel(pRoot->pRight);}cout << pRoot->NodeData << endl;}
}
//后序非递归
struct nosame    //标识节点是否反复出现
{struct BiTree *pnode;bool issame;
};void PostTravel(struct BiTree *pRoot)
{if (pRoot == nullptr){return;}else{struct BiTree *pcur = pRoot;stack<nosame *> mystack;    //避免重复出现nosame *ptemp;while (!mystack.empty() || pcur != nullptr){while (pcur != nullptr){nosame *ptr = new nosame;ptr->issame = true;ptr->pnode = pcur;//节点//cout << pcur->NodeData << endl;
mystack.push(ptr);pcur = pcur->pLeft;    //左节点全部进栈
            }if (!mystack.empty()){ptemp = mystack.top();mystack.pop();                    //出栈if (ptemp->issame == true)        //第一次出现
                {ptemp->issame = false;mystack.push(ptemp);pcur = ptemp->pnode->pRight;//跳到右节点
                }else{cout << ptemp->pnode->NodeData << endl;//打印数据pcur = nullptr;}}}}
}void main()
{struct BiTree *pRoot;struct BiTree node1;struct BiTree node2;struct BiTree node3;struct BiTree node4;struct BiTree node5;struct BiTree node6;struct BiTree node7;struct BiTree node8;node1.NodeData = 1;node2.NodeData = 2;node3.NodeData = 3;node4.NodeData = 4;node5.NodeData = 5;node6.NodeData = 6;node7.NodeData = 7;node8.NodeData = 8;pRoot = &node1;node1.pLeft = &node2;node1.pRight = &node3;node2.pLeft = &node4;node2.pRight = &node5;node3.pLeft = &node6;node3.pRight = &node7;node4.pLeft = &node8;show(pRoot, 1);cout << "中序递归:" << endl;RecMidTravel(pRoot);    //中序递归cout << "中序非递归:" << endl;MidTravel(pRoot);        //中序非递归
cout << "先序递归:" << endl;RecPreTravel(pRoot);cout << "先序非递归:" << endl;PreTravel(pRoot);        //先序非递归
cout << "后序递归:" << endl;RecPostTravel(pRoot);cout << "后序非递归:" << endl;PostTravel(pRoot);        //后序非递归
cin.get();
}

     

 2. 获取二叉树节点个数:

//递归获取二叉树节点个数
int getNodeCount(BiTree *pRoot)
{if (pRoot == nullptr){return 0;}else{return getNodeCount(pRoot->pLeft) + getNodeCount(pRoot->pRight) + 1;}
}

    

3. 判断二叉树是否为完全二叉树:

//判断二叉树是否为完全二叉树
bool isCompleteBiTree(BiTree *pRoot)
{if (pRoot == nullptr){return false;}else{queue<BiTree *> myq;myq.push(pRoot);bool mustHaveChild = false;    //必须有子节点bool result = true;            //结果while (!myq.empty()){BiTree *node = myq.front();//头结点myq.pop();                    //出队if (mustHaveChild)    //必须有孩子
            {if (node->pLeft != nullptr || node->pRight != nullptr){result = false;break;}} else{if (node->pLeft != nullptr && node->pRight != nullptr){myq.push(node->pLeft);myq.push(node->pRight);}else if (node->pLeft != nullptr && node->pRight == nullptr){mustHaveChild = true;myq.push(node->pLeft);}else if (node->pLeft == nullptr && node->pRight != nullptr){result = false;break;}else{mustHaveChild = true;}}}return result;}
}

    

4. 求二叉树两个节点的最小公共祖先:

//求二叉树两个节点的最小公共祖先
bool findnode(BiTree *pRoot, BiTree *node)    //判断节点是否在某个节点下
{if (pRoot == nullptr || node == nullptr){return false;}if (pRoot == node){return true;}bool isfind = findnode(pRoot->pLeft, node);if (!isfind){isfind = findnode(pRoot->pRight, node);}return isfind;
}BiTree *getParent(BiTree *pRoot, BiTree *pChild1, BiTree *pChild2)
{if (pRoot == pChild1 || pRoot == pChild2){return pRoot;}if (findnode(pRoot->pLeft, pChild1)){if (findnode(pRoot->pRight, pChild2)){return pRoot;} else{return getParent(pRoot->pLeft, pChild1, pChild2);}} else{if (findnode(pRoot->pLeft, pChild2)){return pRoot;}else{return getParent(pRoot->pRight, pChild1, pChild2);}}
}

    

5. 二叉树的翻转:

//二叉树的翻转
BiTree *revBiTree(BiTree *pRoot)
{if (pRoot==nullptr){return nullptr;}BiTree *leftp = revBiTree(pRoot->pLeft);BiTree *rightp = revBiTree(pRoot->pRight);pRoot->pLeft = rightp;pRoot->pRight = leftp;    //交换return pRoot;
}

    

6. 求二叉树第k层的节点个数:

//求二叉树第K层的节点个数
int getLevelConut(BiTree *pRoot, int k)
{if (pRoot == nullptr || k < 1){return 0;}if (k == 1){return 1;}else{int left = getLevelConut(pRoot->pLeft, k - 1);int right = getLevelConut(pRoot->pRight, k - 1);return (left + right);}
}

    

7. 求二叉树中节点的最大距离(相距最远的两个节点之间的距离):

//求二叉树中节点的最大距离
struct res    //用以递归间传递距离
{int maxDistance = 0;int maxDepth = 0;
};res getMaxDistance(BiTree *pRoot)
{if (pRoot == nullptr){res r1;return r1;}res leftr = getMaxDistance(pRoot->pLeft);res rightr = getMaxDistance(pRoot->pRight);res last;    //最终结果last.maxDepth = max(leftr.maxDepth + 1, rightr.maxDepth + 1);//求最大深度last.maxDistance = max(max(leftr.maxDistance, rightr.maxDistance), leftr.maxDepth + rightr.maxDepth + 2);//求最大距离return last;
}

    

8. 判断二叉树是否为平衡二叉树:

//判断二叉树是否为平衡二叉树:
bool isAVL(BiTree *pRoot, int & depth)    //需要引用来传递数据
{if (pRoot == nullptr){depth = 0;return true;}int leftdepth = 0;int rightdepth = 0;bool left = isAVL(pRoot->pLeft, leftdepth);bool right = isAVL(pRoot->pRight, rightdepth);if (left && right && abs(leftdepth - rightdepth) <= 1){depth = 1 + (leftdepth > rightdepth ? leftdepth : rightdepth);//深度return true;}else{return false;}
}

        

 

转载于:https://www.cnblogs.com/si-lei/p/9547016.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAC 修改文件夹以及子文件夹和子文件权限 以及 修改文件夹owner

1. 打开Finder&#xff0c;找到想要修改权限的文件夹&#xff0c;打开文件信息对话框。 两种打开方式&#xff1a; 右击文件夹&#xff0c;选择“get info”。 使用“ctrli”。 在弹出对话框底部的“Sharing&Permission” section可以查看文件夹权限信息&#xff1a;N…

windows中使用scrapyd遇到的问题

1.window下‘scrapyd_deploy’不是内部或外部命令&#xff0c;也不是可运行的程序 在windows上使用scrapyd-client 安装后&#xff0c;并不能使用相应的命令scrapyd-deploy 需要在"C:\Python27\Scripts" 目录下 增加scrapyd-deploy.bat文件 内容填充为&#xff1a; …

MAC 设置$PATH 关闭terminal后就失效 解决方案

1 目标 修改$PATH的值 2 问题 在terminal中修改了$PATH&#xff0c;关闭terminal或者换个terminal就不存在了。具体例子&#xff1a; 2.1 查看$PATH当前值 在terminal中输入 echo $PATH2.2 修改$PATH值 此例将/test/folder 加到$PATH的后面。 在terminal中输入 export …

MAC 更新 PHP 指南 以及 PHP常用命令示例

OS: Mac OS X EI Capitan 当前PHP版本&#xff1a;5.5.30 升级后PHP版本&#xff1a;7.0.11 升级步骤参考&#xff1a;https://coolestguidesontheplanet.com/upgrade-php-on-osx/ 1. 安装新版本PHP&#xff1a; 打开terminal&#xff0c;运行&#xff1a; curl -s http://…

mac 鼓捣php 多版本切换

php-v 和 phpinfo()不一样 1.切换httpd.conf 里面的.so文件 2.sudo vi ~/.zshrc 切换 export PATH"/usr/local/opt/php7.1/bin:$PATH"export PATH"/usr/local/opt/php7.1/sbin:$PATH"#export PATH"/usr/local/opt/php7.0/bin:$PATH"#export PATH…

【刷题】BZOJ 2194 快速傅立叶之二

Description 请计算C[k]sigma(a[i]*b[i-k]) 其中 k < i < n &#xff0c;并且有 n < 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。 Input 第一行一个整数N,接下来N行&#xff0c;第i2..iN-1行&#xff0c;每行两个数&#xff0c;依次表示a[i],b[i] (0 < i …

MAC 安装 Magento2 community edition 详细步骤

花了好几天时间&#xff0c;终于在Mac OS X EI Capitan上成功安装magento2.1.1. 此处详细记录每个步骤&#xff0c;以备未来使用。 参考magento官方指南&#xff1a;(Easy) Install the Magento archive on your server 1. 确保系统满足prerequisite&#xff1a; 建议不要使用…

22_IO_第22天(File、递归)_讲义

今日内容介绍 1、File 2、递归 xmind&#xff1a;下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg 密码&#xff1a;845a 01IO技术概述 * A:IO技术概述* a: Output* 把内存中的数据存储到持久化设备上这个动作称为输出&#xff08;写&a…

MAC PHP7 如何disable xdebug

1. 查看xdebug当前状态是否是enable 打开terminal&#xff0c;输入&#xff1a; php -m | grep xdebugterminal返回xdebug&#xff0c;说明现在xdebug是enable状态。 2.找到php配置文件夹 在terminal中输入&#xff1a; which php 进入php.d文件夹&#xff0c;可以看到exten…

django之上传图片

上传图片 当Django在处理文件上传的时候&#xff0c;文件数据被保存在request.FILESFILES中的每个键为<input type"file" name"" />中的name注意&#xff1a;FILES只有在请求的方法为POST 且提交的<form>带有enctype"multipart/form-data…

『 Luogu P3205 』 HNOI2010 合唱队

解题思路 设置两个二维数组 $f$ 和 $g$&#xff0c;含义如下。 $f[l][r]$ 表示在期望得到的队形中 $l\rightarrow r$ 这段区间初始队形排列的方案数&#xff0c;并且最后一个加入进去的是第 $l$ 个人。 $g[l][r]$ 表示在期望得到的队形中 $l\rightarrow r$ 这段区间初始队形排列…

福大软工1816 · 第一次作业 - 准备

福大软工1816 第一次作业 - 准备 期待→迷茫→恐惧→振作or放弃&#xff1f; 前言&#xff1a;个人情况概述 虽然长辈都说我是个聪明的孩子&#xff0c;但我觉得也许那只是客套话——还记得从小学时我的成绩仅处于中游偏下&#xff0c;初中稍有提升&#xff0c;但到高中又回到…

cf242 E

题意&#xff1a; $n$ 个数 $a_i$, 两种询问 $1, l, r$ 查询 $[l, r]$ 的和 $2, l, r, x$ 将区间 $[l, r]$ 所有数异或 $x$ 建立 $30$ 课线段树 第 $i$ 颗线段树维护所有 $a$ 二进制的第 $i$ 为上的数字 $0, 1$ 异或操作分别以 $x$ 的二进制相应位异或相应线段树 可见只有当 $…

记忆力

1、越集中注意力&#xff0c;越难回想起我们的记忆&#xff0c;就像我们看一个字看久了&#xff0c;会慢慢不认识。 2、转载于:https://www.cnblogs.com/LXP-Never/p/9579978.html

物联网初步之电阻性电路分析 第三部分 电路分析方法和电路原理

目录 电阻性电路分析第三章 电路分析方法3-1 支路电流法3-2 网孔电流法3-3 节点电位法3-4本章总结第四章 电路定理4-1 叠加定理戴维南定理和诺顿定理电阻性电路分析 声明&#xff1a;本学习笔记中的部分图片来自于王丽华老师的PPT&#xff0c;感想王老师~~ 第三章 电路分析方法…

《前端JavaScript重点》学习笔记 1-5

JS三座大山&#xff1a;原型和原型连、作用域和闭包、异步和单线程第一篇-----变量类型和计算 参考&#xff1a;https://www.jianshu.com/p/8cb184b26ed1题目&#xff1a;1.JS中使用typeof能得到哪些类型2.何时使用&#xff0c;何时使用3.JS有哪些内置函数4.JS变量按照存储方式…

将页面数据转json存入数据库

SSMlayui前台页面将数据转json存入数据库 最近做了一个添加的功能&#xff0c;页面中的字段并不是和数据库变字段一 一对应的&#xff0c;页面中好几个字段的值要把它们转为json&#xff0c;然后存入数据库表中的一个字段。 1&#xff0c;首先是添加了一个实体类来放这些数据…

简述openstack

大家好&#xff0c;我顾某人又回来了&#xff0c;开学第一更。。。。以下内容均为个人理解和整理&#xff0c;有不对的地方还望dalao指正。。。。。 本文所用图片均已标明来源。 openstack是什么&#xff1f; OpenStack是一个开源的云计算管理平台项目&#xff0c;由几个主要的…

vue+layui获取CheckBox的值

vuelayui获取CheckBox的值 定义一样的name和v-filter 然后对其进行监听。

rocket-console控制台安装

1.下载 github地址&#xff1a;https://github.com/apache/rocketmq-externals 2.选择稳定版本&#xff1a; 3.下载到本地&#xff1a; 环境需求 maven jdk git clone https://github.com/apache/rocketmq-externals.git 4.修改配置&#xff1a; find -name application…