题目: 如果把二叉树看成一个图,父子节点之间的连线看成是双下那个的,我们姑且定义距离是两个节点之间边的个数,写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.求二叉树中节点的最大距离相关推荐

  1. 【编程题目】求二叉树中节点的最大距离

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

  2. 求二叉树中节点的最大距离

    struct node{ Node Left; Node Right; int MaxLeft;//左子树到该节点的最长距离 int MaxRight;//右子树到该节点的最长距离 char chVa ...

  3. 编程之美-求二叉树中节点的最大距离方法整理

    [试题描述] 方法:

  4. 微软算法100题11 求二叉树中两节点之间的最大距离

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

  5. c++实现二叉树中节点的最大距离 - c++语言程序开发技术文章,c++实现二叉树中节点的最大距离...

    文章前半部分能懂,可是后面的Milo不是很理解,可能有待以后学习..... 微软面试题之一,难度系数中,题目描述如下: 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看 ...

  6. 【100题】第十一题(二叉树中节点的最大距离)

    一,题目:        如果把二叉树看成一个图,父子节点之间的连线看成是双向的(无向图),定义"距离"为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离 ...

  7. 变形二叉树中节点的最大距离(树的最长路径)——非递归解法

    问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...

  8. 剑指offer之求二叉树中两个节点的最低共同父节点

    1 问题 求二叉树中俩个节点的最低共同父节点,比如二叉树如下 42 61 3 5 7 比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父 ...

  9. 求二叉树中的第一条最长路径长度,并输出最长路径上的节点

    #include <stdio.h> #define MaxSize 1000typedef struct BiTNode {int data;struct BiTNode *lchild ...

  10. 求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

最新文章

  1. 如何使git接受自签名证书?
  2. Xamarin XAML语言教程基本视图ContentViewg构架范围框架
  3. 035_jQuery Ajax的ajaxSetup方法
  4. c语言printf族函数,C语言中的printf族函数深入详解
  5. SAP安装前应准备的事项
  6. 白话理解傅里叶变换原理(时域频域)
  7. 打开阿里云网页为空白的解决办法
  8. 虚拟vpc服务器搭建,服务器搭建vpc
  9. 玉米社:百度竞价关键词“否定”与“精确否定”的区别
  10. 网络工程师项目管理关键路径和松弛时间计算
  11. 大数据服务模型设计:默默无闻的贤内助
  12. 单车组装的思路(本文尽量针对2K以内的山地车)
  13. shell字符串截取掐头去尾操作
  14. Kubectl常用命令(三)
  15. wps思维导图聚焦模式是灰色不能用的解决方案
  16. Mapper 重命名问题
  17. 用python爬取斗图啦图片
  18. css引入自定义字体/特殊字体/ttf格式语言包
  19. Bluetooth设备之间如何建立连接
  20. Java小白入门200例51之根据出生日期计算星座

热门文章

  1. 使用cfssl生成证书时报json: cannot unmarshal object into Go value of type []csr.Name错误
  2. 同济大学计算机保研名单,同济大学2021届保研率27.8%,主要保研本校、复交清国...
  3. java ehcache手动关闭_java – 如何为测试目的关闭ehcache
  4. 【渝粤教育】国家开放大学2018年春季 0195-22T机械设计基础 参考试题
  5. 【问题解决方案】Markdown正文中慎用星号否则容易变斜体
  6. SpringBoot开发案例之拦截器注入Bean
  7. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)----第7节: 获取异线程释放的对象...
  8. python学习第二十三节(反射以及小工具)
  9. Map集合-根据宠物昵称查找宠物
  10. log4j2配置文件