二叉树两节点距离java,求二叉树中两个节点的最远距离

问题定义

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。

计算一个二叉树的最大距离有两个情况:

f217e141800988c2650d8abf6363722a.png

190b7096f5cf2e64a9c7664cfb2e669c.png

情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。

情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。

思路:

1,后序遍历每一节点,找出该节点到最右边的距离以及最左边的距离;

2,找到之和最大的即可。

//需保存左子树中最长距离、右子树最长距离和当前树的深度。

//以下提供两种方法。

#include

#include

using namespace std;

int max(int l,int r)

{

return l>r?l:r;

}

struct BinaryTreeNode

{

int data;

BinaryTreeNode* left;

BinaryTreeNode* right;

BinaryTreeNode(int x)

:data(x)

, left(NULL)

, right(NULL)

{}

};

class BinaryTree

{

protected:

BinaryTreeNode* _root;

BinaryTreeNode* _CreateBinaryTree(int* arr, int& index, int size)

{

BinaryTreeNode* root = NULL;

if (index < size&&arr[index] != '#')

{

root = new BinaryTreeNode(arr[index]);

root->left = _CreateBinaryTree(arr, ++index, size);

root->right = _CreateBinaryTree(arr, ++index, size);

}

return root;

}

public:

BinaryTree()

:_root(NULL)

{}

BinaryTree(int *arr, int size)

{

int index = 0;

_root = _CreateBinaryTree(arr, index, size);

}

/*int MaxTwoNodeDistance()

{

if(_root==NULL)

{

return 0;

}

int maxDistance=0;

_Distance(_root,maxDistance);

return maxDistance;

}*/

int MaxTwoNodeDistance()

{

if(_root==NULL)

return 0;

int maxLeft=0;

int maxRight=0;

return _Distance(_root,maxLeft,maxRight);

}

int Height()

{

return _Height(_root);

}

void PreOrder_Non()

{

if (_root == NULL)

return;

BinaryTreeNode* cur = _root;

stack s;

s.push(_root);

while (!s.empty())

{

cur = s.top();

printf("%d ", cur->data);

s.pop();

if (cur->right)

s.push(cur->right);

if (cur->left)

s.push(cur->left);

}

cout << endl;

}

protected:

int _Distance(BinaryTreeNode* root,int& left,int &right)

{

if(root==NULL)

{

left=0;

right=0;

return 0;

}

int mll,mlr,mrl,mrr,dl,dr;

if(root->left==NULL)

{

left=0;

dl=0;

}

else

{

dl=_Distance(root->left,mll,mlr);

left=max(mll,mlr)+1;

}

if(root->right==NULL)

{

right=0;

dr=0;

}

else

{

dr=_Distance(root->right,mrl,mrr);

right=max(mrl,mrr)+1;

}

return max(max(dl,dr),left+right);

}

/*int _Distance(BinaryTreeNode* root,int& max)

{

if(root==NULL)

return 0;

int maxLeft=0;

int maxRight=0;

if(root->left)

{

maxLeft=_Distance(root->left,max);

if(maxLeft>max)

max=maxLeft;

}

if(root->right)

{

maxRight=_Distance(root->right,max);

if(maxRight>max)

max=maxRight;

}

if(maxLeft+maxRight>max)

max=maxLeft+maxRight;

return maxLeft>maxRight?maxLeft+1:maxRight+1;

}*/

int _Height(BinaryTreeNode* root)

{

if (root == NULL)

return 0;

int left = _Height(root->left);

int right = _Height(root->right);

return left > right ? left + 1 : right + 1;

}

};

int main()

{

int arr1[]={1,2,4,5,'#','#','#',7,'#','#',3,'#',6};

int arr2[]={1,2,3,4,'#','#','#',5,'#',6};

BinaryTree t1(arr1,sizeof(arr1)/sizeof(arr1[0]));

t1.PreOrder_Non();

cout<

BinaryTree t2(arr2,sizeof(arr2)/sizeof(arr2[0]));

t2.PreOrder_Non();

cout<

}

0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?

以往写cli下运行的业务或者测试代码&#xff0c;总是新建文件&#xff0c;面向过程编写代码。几次之后&#xff0c;cli目录下好多文件&#xff0c;即便勉强在一个cli测试文件中写了一个类&#xff0c;也是让其中的一个方法自启动&#xff0c;要测试别的方法&#xff0c;总是要修…

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决&#xff1f;,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决&#xff1f;易采站长站&#xff0c;站长之家为您整理了php gd库中文乱码怎么解决&#xff1f;的相关内容。解决方法&#xff1a;1、网站整站使用UTF8编码&#xff0c;如果已使用GB2312…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题&#xff1a;JS实现网站图片飘窗效果&#xff0c;JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果&#xff0c;Java悬浮广告&#xff0c;郑州SEO提供以下代码&#xff0c;仅供参考&#xff1a;飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库&#xff0c;包括数据类型&#xff0c;功能&#xff0c;架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包&#xff0c;默认PostgreSQL是没有的&#xff0c;需要安装orafce包来实现…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退&#xff0c;LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果)&#xff0c;VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…

kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...

为了解决Windows远程桌面访问Ubuntu 12.04 之一 中提到的VNC远程桌面的缺点(见http://www.linuxidc.com/Linux/2012-07/64801.htm)&#xff0c;我们采用第二种方法XRDP&#xff0c;该方法支持多用户登录并远程桌面。1、首先参考Windows远程桌面访问Ubuntu 12.04 之安装VNC中提到…

linux装redis环境变量,linux 怎样安装redis

人到中年有点甜获取Redis1、通过官网http://redis.io/获取稳定版源码包下载地址&#xff1b;2、通过wget http://download.redis.io/releases/redis-3.0.2.tar.gz下载 源码包&#xff1b;2编译安装Redis1、解压源码安装包&#xff0c;通过tar -xvf redis-3.0.2.tar.gz解压源码&…

word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符

word文件中有换行符很正常&#xff0c;但是想要将换行符全部替换为回车符&#xff0c;该怎么替换?以下是学习啦小编为您带来的关于word文章中的换行符批量替换为回车符&#xff0c;希望对您有所帮助。word文章中的换行符批量替换为回车符1、在打开的word中&#xff0c;依次点击…

linux禁用防火墙配置,CentOS Linux防火墙配置及关闭

最近在CentOS Linux下安装配置 Oracle 数据库的时候&#xff0c;总显示因为网络端口而导致的EM安装失败&#xff0c;遂打算先关闭一下防火墙。偶然看到防火墙的配置操作说明&#xff0c;感觉不错。执行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码&#xff1a;#include int main(){int n1;int m2;switch(n){case 1:m;case 2:n;case 3:switch(n){case 1:n;case 2:m;n;break;}case 4:m;break;default:break;}printf("%d %d",m,n);return 0;}代码看起来很简单&#xff0c…

linux dd 进度条,Progress 进度条 – DDProgressHUD

DDProgressHUDProgress 进度条&#xff0c;UIActivityIndicatorView 小菊花&#xff0c;弹窗&#xff0c;状态显示&#xff0c;高度自定义DDProgressHUD的介绍提供了四种类型的展示&#xff1a;显示无限旋转的加载图(比如小菊花&#xff0c;可以自定义)&#xff0c;显示文字信息…

Android动态图标包制作教程,安卓手机ico图标制作美化图文教程

如何让手机更加与众不同?今天我们就来学习如何利用出色的ico图标制作软件——Axialis IconWorkshop制作出美化手机屏幕的个性图标!如今&#xff0c;每个人都有属于自己的手机&#xff0c;每天使用手机聊QQ、刷微博、玩游戏&#xff0c;可以说手机已经是很多人生活中不可缺少的…

android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式

果&#xff1a;和之前的一样&#xff0c;在布局文件中&#xff1a;android:id"id/progressBar3"android:layout_width"wrap_content"android:layout_height"wrap_content"android:indeterminate"false"android:indeterminateDrawable&…

android gridview行分割线,Android使用GridView实现表格分割线效果

使用gridview实现表格分割线效果&#xff0c;网格布局表格布局也是可以实现的。效果如下&#xff1a;1.主函数代码&#xff1a;package com.example.qd.douyinwu;import android.app.activity;import android.content.context;import android.os.bundle;import android.support…

android hook 实例,代码实例分析android中inline hook

以下内容通过1、实现目标注入程序&#xff0c;2、实现主程序&#xff0c;3、实现注入函数&#xff0c;4、thumb指令集实现等4个方面详细分析了android中inline hook的用法&#xff0c;以下是全部内容&#xff1a;最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍&#xf…

dax 筛选 包含某个字_筛选状态(ALL与REMOVEFILTERS)

这一章比较绕&#xff0c;但是帮助我们理清切片器的筛选状态以及主要函数对于公式筛选上下文的改变。1.切片器的筛选状态切片器的全选与全不选的状态的区别&#xff0c;我们可以看下图&#xff1a;全不选全选多个点击筛选逐个点击至全部结论初始状态&#xff0c;没有选择任何元…

山东鲁能轨道智能巡检机器人_温湿度传感器在轨道巡检机器人中的应用

▲地下综合管廊智慧管廊建设&#xff0c;是智慧城市在地下的一个缩影&#xff0c;有助于缓解“大城市病”&#xff0c;实现精细化和动态管理。与此同时&#xff0c;各种传感器技术也将被运用到地下综合管廊运维的每一环&#xff0c;这其中&#xff0c;地下管廊巡检机器人便是其…

android显示网络图片控件,Android控件之ImageView(二)

前言在上一篇文章中&#xff0c;我们讲解了如何加载本地图片&#xff0c;那么在实际项目中 ImageView 大多数使用场景是加载网络图片&#xff0c;网络图片其实就是存储在服务器上的文件&#xff0c;我们需要从服务器获取到文件的二进制输入流 Inpustream &#xff0c;然后将其转…

坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模

曲面流动可以建什么模型&#xff1f;这样的▼这样的▼还有这样的▼那究竟如何使用曲面流动呢?本文告诉你!曲面流动是什么&#xff1f;曲面流动功能相当于Rhino(犀牛)中的“沿曲面流动”命令&#xff0c;可以使来源几何体群组或组件&#xff0c;根据基准平面为参照&#xff0c;…

android o 结构光流程,惊艳亮相!一分钟看懂OPPO Find X 3D结构光技术是什么鬼,太牛了...

法国时间6月19日&#xff0c;OPPO在巴黎卢浮宫正式举办未来旗舰Find X发布会。此次亮相的Find X新机&#xff0c;既有充满艺术感的3D玻璃机身设计&#xff0c;又有3D结构光、曲面全景屏、双轨潜望结构等多项黑科技。众多黑科技中&#xff0c;以3D结构光O-face最受数目。据悉&am…