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 安装 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…

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

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

将页面数据转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…

只允许对最后一条记录进行修改

今天做了个小功能想和大家分享一下在我任务描述里有个这样的描述&#xff1a;只能对最后一条记录进行修改。我刚开始我这样想的&#xff0c;每条记录前面都有给他一个radio&#xff0c;然后对你选择的数据去判断他是不是最后添加的那一条&#xff0c;后台发现这样有点难度&…

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

为了加强安全性&#xff0c;MySQL5.7为root用户随机生成了一个密码&#xff0c;在error log中&#xff0c;关于error log的位置&#xff0c;如果安装的是RPM包&#xff0c;则默认是/var/log/mysqld.log。 一般可通过log_error设置 mysql> select log_error; ---------------…

vue复选框CheckBox清空选中的值

最近遇到了这样的一个问题&#xff0c;做了一个添加功能&#xff0c;发现添加了一次记录以后&#xff0c;添加第二次的时候&#xff0c;页面上复选框有我上次选中的值&#xff0c;后来试了很多方法&#xff0c;只有下面这个方法解决了这个问题。上面标出来的是对普通的input进行…

添加时,时间格式明明和数据库格式一样,却一直在报错,存不进去

数据库用的date&#xff0c;然后我前台也用的date格式&#xff0c;却存不进去&#xff0c;我还以为是缓存问题&#xff0c;然后一直在清缓存&#xff0c;结果没啥用&#xff0c; 后来在实体类加了DateTimeFormat这个注解&#xff0c;成功解决。

freemarker页面读取时间date类型报错

以前写过一篇添加时间添加失败的问题&#xff0c;现在我又发现了另外一个问题 刚开始我是这样放进页面&#xff0c;然后就报错&#xff0c;说freemarker的类型错误。我就去控制器打印输出这个时间&#xff0c;发现是有值得&#xff0c;但不是yyyy-mm-dd格式的&#xff0c;我数…

关于idea的git账号与电脑的git账号不一致的问题。已解决!

最近发现了一个问题&#xff0c;我进公司&#xff0c;公司给我发的电脑是别的同事用过的&#xff0c;然后上面呢保留了他的git账号&#xff0c;我要继续用这台电脑开发&#xff0c;用他的账号肯定是不行的&#xff0c;然后我就上网搜教程&#xff0c;搜到的教程全部都是让我删除…

codeforces CF986C AND Graph 建圖 dfs

$ \rightarrow $ 戳我進CF原題 C. AND Graphtime limit per test: 4 secondsmemory limit per test: 256 megabytesinput: standard inputoutput: standard outputYou are given a set of size $ m $ with integer elements between $ 0 $ and $ 2^n-1 $ inclusive. Lets build…

HackRF 无线门铃信号录制与重放

本文内容、开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称&#xff1a;开源SDR实验室 HackRF链接&#xff1a;https://item.taobao.com/item.htm?spma1z10.1-c.w4004-13257850194.8.69503d888aIzVL&id526187854860 无线门铃链接&#xff1a;https://item.…