二叉树两节点距离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中update()函数,update_option()函数

update_option()函数的功能是更新wp_options表中指定的一条数据。可以使用此函数代替add_option函数&#xff0c;尽管它不够灵活。 update_option函数会检查并判断选项是否已经存在。如果不存在&#xff0c;用add_option (’option_name’, ‘option_value’)添加选项。除非用户…

java解析MT940报文,swift MT报文解析处理

swift 官方资料&#xff1a;https://www2.swift.com/knowledgecentre/publications/us5mc_20180720/2.0?topicalec.htm#genalecswift 百科&#xff1a;https://baike.baidu.com/item/SWIFT/1108075prowide - swift 报文处理 开源框架&#xff1a;https://www.prowidesoftware.…

php怎么实现匿名评论,PHP-匿名对象与匿名类的实现过程-0905

* 匿名类:* 1. php 7.0 才支持* 2. 类似于匿名函数,就是没有名称的类* 3. 匿名类适合于一次性的创建与引用* 4. 匿名类总是与: new 配套使用类的三种访问方式实例/*** 匿名类:* 1. php 7.0 才支持* 2. 类似于匿名函数,就是没有名称的类* 3. 匿名类适合于一次性的创建与引用* 4.…

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

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

matlab中平均函数用法,matlab中怎样在X的指定范围内求y的平均值

有两组数据&#xff0c;前面一组值设为x后面一组设为y。x是坐标的变化范围&#xff0c;y是每个坐标下力的大小&#xff0c;怎样在X的指定范围内求y的平均值&#xff1f;&#xff1f;比如下面x范围是从-18.19959641到-18.00003052之内的 怎样求得-18.19959641到-18.18049049这个…

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

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

php观察者模式和注册数模式,PHP观察者模式

观察者模式的核心是允许你的应用程序注册一个回调&#xff0c;当某个特定的事件发生时便会触发它。实现观察者模式&#xff0c;我们使用一个名为Event的类实现它&#xff0c;这个类有2个公共的方法。1. registerCallback() :这个方法允许你用规定的名称附加许多回调到一个事件中…

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

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

php spss,spss新手入门

随着速度越来越快,计算机的功能越来越多,计算统计功能反而已经成为了计算机的一个次要部分.不过,对于我们这些从事社会学学习和研究的人来说,快速的计算和统计仍旧是我们使用计算机的主要功能,所以我们平日的工作总是离不开SPSS(Statistical Package for the SocialScience社会…

load out mysql,快速的mysql导入导出数据(load data和outfile)

当读取位于服务器上的文本文件时&#xff0c;文件必须处于数据库目录或可被所有人读取。1 指定关键词low_priority&#xff0c;MySQL将会等到没有其他人读这个表的时候&#xff0c;才把插入数据。可以使用如下的命令&#xff1a;load data low_priority infile "/home/m…

matlab rem和mod,Matlab的mod和rem

通常取模运算也叫取余运算&#xff0c;它们返回结果都是余数.rem和mod唯一的区别在于:当x和y的正负号一样的时候&#xff0c;两个函数结果是等同的&#xff1b;当x和y的符号不同时&#xff0c;rem函数结果的符号和x的一样&#xff0c;而mod和y一样。这是由于这两个函数的生成机…

php sslv3握手失败,Boost Beast握手:sslv3警报握手失败错误

我正在使用Boost Beast连接到一个Web Socket服务器,但是我一直收到一个错误Resolving push-private.kucoin.com:443...Performing SSL handshake...terminate called after throwing an instance of boost::wrapexcept<:system::system_error>what(): handshake: sslv3 a…

python猜猜我是几,我在python中猜数游戏的问题

我是新手&#xff0c;所以请原谅下面的混乱…我正试图写一个数字猜谜游戏。计算机应该随机生成一个介于1到10之间的数字。用户只允许3次尝试正确猜测数字。一个用户要么猜对了&#xff0c;要么尝试完了&#xff0c;我应该让程序问用户&#xff0c;如果他们想再次玩&#xff0c;…

php pc_base,phpcms二次开发之base.php的桥梁作用_PHP教程

PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问&#xff0c;采用单一入口模式进行项目部署和访问&#xff0c;无论访问任何一个模块或者功能&#xff0c;只有一个统一的入口。入口程序是在前期处理用户请求的引导程序。它是唯一一个可以被最终用户可以直接请求运行…

oracle 表访问,向oracle导入访问表

我在将表导入到oracle时遇到问题。当我导入一个字段是例如导入&#xff1a;在访问我已经20&#xff0c;200 和进口到Oracle‘‘中访问和导入oracle作为‘12535’向oracle导入访问表在访问20’或’125.35它被声明作为数字&#xff0c;并在oracle中它已经改为文本&#xff0c;浮动…

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

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

oracle脚本审核平台,Oracle 脚本(适应各种业务需要)

Oracle 脚本(适应各种业务需要)1. 取A表的数据&#xff0c;更新B表字段update m_build bset b.district_id(select d.district_idfrombjhouse.d_district dwhereb.build_name_jqd.district_name)where exists(select 1frombjhouse.d_district dwhereb.build_name_jqd.district…

linux 文件mtime,linux 文件的atime,ctime,mtime查看與修改

查看ls -a默認顯示的是修改時間ls -c / --timestatus / --timectime顯示的是狀態修改時間(即權限修改時間)ls -u / --timeuse / --timeaccess / --timeatime表示的是文件訪問時間修改touch: 缺少了文件操作數請嘗試執行“touch --help”來獲取更多信息。[weilocalhost ~]$ touc…

linux 内核系统优化,Linux系统内核优化(一)

Linux内核参数调整(用于大并发的WEB服务器)cat > /etc/sysctl.conf net.ipv4.tcp_syncookies 1fs.file-max 999999net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_keepalive_time 600net.ipv4.tcp_fin_timeout 30net.ipv4.tcp_max_tw_buckets 5000net.ipv4.ip_local_port_range…

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版本都试过了&#…