11.求二叉树中节点的最大距离
题目: 如果把二叉树看成一个图,父子节点之间的连线看成是双下那个的,我们姑且定义距离是两个节点之间边的个数,写1个程序,求1棵二叉树中相距最远的两个节点之间的距离
解: 提示把二叉树看成图,有点误导的意思。 首先,两个节点之间的距离不存在重叠的边,其次,从1个节点到另1个节点的走法,肯定是第1个节点走到拐点,然后开始想第2个节点走,这个拐点一定是第1,2个节点的共同祖先。因此可用递归解决。
给定树T,首先求出树T的左子树的高度left_height,然后求出树T的右子树的高度right_height,那么假如说这个最大距离经过的拐点是T,那么这个最大距离就是left_height+right_height,然后递归求出左孩子的最大距离和右孩子的最大距离,3者之中最大值就是这个二叉树的最大距离
代码:
/*求最大距离,其实这是1个递归问题。 因为a-b节点的边不能有重叠的,首先求出根结点左孩子最大深度,右孩子最大深度。dis=heightleft+hightright,然后分别 左孩子的dis和右孩子的dis,最大的就是本题要求的节点的最大距离. 若左右孩子是NULL,则返回0*/#include<iostream> using namespace std;typedef int datatype; typedef struct node {datatype data;struct node* left;struct node* right; }Tree;// 先序建树,NULL节点输入0 Tree* create_tree(void) {Tree* t=NULL;datatype value;cin>>value;if(value==0)return NULL;else{t=new Tree;t->data=value;t->left=create_tree();t->right=create_tree();}return t; }//释放树 void free_tree(Tree* t) {if(t){free_tree(t->left);free_tree(t->right);delete t;t=NULL;} }//求树t的高度 int height(Tree* t) {if(t==NULL)return 0;else{int left_height=height(t->left);int right_height=height(t->right);if(left_height>=right_height)return left_height+1;elsereturn right_height+1;} }//求t的最大距离 int getdis(Tree* t) {if(t){int leftheight=height(t->left);int rightheight=height(t->right);//高h,则有h-1条边,h1-1+h2-1+1+1=h1+h2int dis=leftheight+rightheight;int dis_left=getdis(t->left);int dis_right=getdis(t->right);if(dis>=dis_left && dis>=dis_right)return dis;if(dis_left>=dis && dis_left>=dis_right)return dis_left;if(dis_right>=dis && dis_right>=dis_left)return dis_right;}elsereturn 0; }int main(void) {Tree* root=NULL;root=create_tree();cout<<height(root)<<endl;cout<<getdis(root)<<endl;free_tree(root);return 0; }
试验了几个树,都能输出正确结果。例如输入 1 2 0 3 4 5 6 7 0 0 0 0 0 8 0 9 0 10 0 11 0 0 12 0 0 ,最大距离是8
转载于:https://www.cnblogs.com/buxianghe/p/3203945.html
11.求二叉树中节点的最大距离相关推荐
- 【编程题目】求二叉树中节点的最大距离
第 11 题(树) 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二 ...
- 求二叉树中节点的最大距离
struct node{ Node Left; Node Right; int MaxLeft;//左子树到该节点的最长距离 int MaxRight;//右子树到该节点的最长距离 char chVa ...
- 编程之美-求二叉树中节点的最大距离方法整理
[试题描述] 方法:
- 微软算法100题11 求二叉树中两节点之间的最大距离
第11 题 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相 ...
- c++实现二叉树中节点的最大距离 - c++语言程序开发技术文章,c++实现二叉树中节点的最大距离...
文章前半部分能懂,可是后面的Milo不是很理解,可能有待以后学习..... 微软面试题之一,难度系数中,题目描述如下: 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看 ...
- 【100题】第十一题(二叉树中节点的最大距离)
一,题目: 如果把二叉树看成一个图,父子节点之间的连线看成是双向的(无向图),定义"距离"为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离 ...
- 变形二叉树中节点的最大距离(树的最长路径)——非递归解法
问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...
- 剑指offer之求二叉树中两个节点的最低共同父节点
1 问题 求二叉树中俩个节点的最低共同父节点,比如二叉树如下 42 61 3 5 7 比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父 ...
- 求二叉树中的第一条最长路径长度,并输出最长路径上的节点
#include <stdio.h> #define MaxSize 1000typedef struct BiTNode {int data;struct BiTNode *lchild ...
- 求二叉树中第K层结点的个数
一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...
最新文章
- 如何使git接受自签名证书?
- Xamarin XAML语言教程基本视图ContentViewg构架范围框架
- 035_jQuery Ajax的ajaxSetup方法
- c语言printf族函数,C语言中的printf族函数深入详解
- SAP安装前应准备的事项
- 白话理解傅里叶变换原理(时域频域)
- 打开阿里云网页为空白的解决办法
- 虚拟vpc服务器搭建,服务器搭建vpc
- 玉米社:百度竞价关键词“否定”与“精确否定”的区别
- 网络工程师项目管理关键路径和松弛时间计算
- 大数据服务模型设计:默默无闻的贤内助
- 单车组装的思路(本文尽量针对2K以内的山地车)
- shell字符串截取掐头去尾操作
- Kubectl常用命令(三)
- wps思维导图聚焦模式是灰色不能用的解决方案
- Mapper 重命名问题
- 用python爬取斗图啦图片
- css引入自定义字体/特殊字体/ttf格式语言包
- Bluetooth设备之间如何建立连接
- Java小白入门200例51之根据出生日期计算星座
热门文章
- 使用cfssl生成证书时报json: cannot unmarshal object into Go value of type []csr.Name错误
- 同济大学计算机保研名单,同济大学2021届保研率27.8%,主要保研本校、复交清国...
- java ehcache手动关闭_java – 如何为测试目的关闭ehcache
- 【渝粤教育】国家开放大学2018年春季 0195-22T机械设计基础 参考试题
- 【问题解决方案】Markdown正文中慎用星号否则容易变斜体
- SpringBoot开发案例之拦截器注入Bean
- Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)----第7节: 获取异线程释放的对象...
- python学习第二十三节(反射以及小工具)
- Map集合-根据宠物昵称查找宠物
- log4j2配置文件