题目描述 二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数。二叉树结点的最大距离是所有结点间距离的最大值。例如,下图所示二叉树结点最大距离是3,C和D的距离。

  A/  \
B    D\C

二叉树用先序遍历顺序创建,#表示空树。计算二叉树结点最大距离和最大距离的两个结点。

如果有多个解,输出字典序最小的解(即第一个结点字母更小的,如果第一个字母相同,输出第二个结点字母更小的)。

输入

测试次数T
第2行之后的T行,每行为一棵二叉树先序遍历结果(#表示空树)

输出

对每棵二叉树,输出树的结点最大距离和最大距离的结点,输出格式见样例。

样例输入

3
A##
ABC##EF#G###D##
ABEH###F#K###

样例输出

0:
5:D G
4:H K

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int Max_Dis[100];
char lc[100];
char rc[100];
int I = 0;
class Binary_tree_node
{public:char data;                    //数据域Binary_tree_node *LeftChild;  //左孩子Binary_tree_node *RightChild; //右孩子Binary_tree_node(){LeftChild = NULL;RightChild = NULL;}~Binary_tree_node(){delete LeftChild;delete RightChild;}
};class Binary_tree
{public:Binary_tree_node *Root; //根结点int pos;                //位置string strTree;         //字符串树int deep;               //深度int leftdeep;           //左子树深度int rightdeep;          //右子树深度char left_ch;           //左子树叶子结点值char right_ch;          //右子树叶子结点值char ch;                //字符int md;                 //最大距离Binary_tree(string str){pos = 0;deep = 0;leftdeep = 0;rightdeep = 0;md = 0;strTree = str;Root = CreateBiTree();}//先序遍历建立二叉树Binary_tree_node *CreateBiTree() {char ch = strTree[pos];pos++;if (ch == '#') //#表示空结点{return NULL;}else //非空结点{Binary_tree_node *T;T = new Binary_tree_node();T->data = ch;T->LeftChild = CreateBiTree();T->RightChild = CreateBiTree();return T;}}//计算左孩子结点层数及获取其叶子结点的值void countleftdeep(Binary_tree_node *p) {if (p->LeftChild == NULL){leftdeep = 0;left_ch = p->data;}else{p = p->LeftChild;countdeep(p, 0);leftdeep = deep;left_ch = ch;}}//计算右孩子结点层数及获取其叶子结点的值void countrightdeep(Binary_tree_node *p) {if (p->RightChild == NULL){rightdeep = 0;right_ch = p->data;}else{p = p->RightChild;countdeep(p, 0);rightdeep = deep;right_ch = ch;}}//计算二叉树的深度void countdeep(Binary_tree_node *p, int i) {if (p != NULL) //不为空树{i++;if (p->LeftChild == NULL && p->RightChild == NULL){if (deep < i){deep = i;ch = p->data;}}countdeep(p->LeftChild, i);countdeep(p->RightChild, i);}}void Calculate_distance(Binary_tree_node *p){if (p != NULL){deep = 0;countleftdeep(p); deep = 0;countrightdeep(p); deep = 0;md = leftdeep + rightdeep;Max_Dis[I] = md;lc[I] = left_ch;rc[I] = right_ch;I++;Calculate_distance(p->LeftChild);Calculate_distance(p->RightChild);}}
};int main()
{int t;cin >> t;while (t--){for (int i = 0; i < I; i++){Max_Dis[i] = 0;}//初始化lc和rc为0memset(lc, 0, sizeof(lc));memset(rc, 0, sizeof(lc));I = 0;string str;cin >> str;Binary_tree Bt(str);Bt.Calculate_distance(Bt.Root);int m = Max_Dis[0];//比较计算出结点间距离的最大值int index = 0;for (int i = 0; i < I; i++){if (Max_Dis[i] > m){index = i;}}cout << Max_Dis[index] << ":";if (Max_Dis[index] != 0){cout << lc[index] << " " << rc[index] << endl;}else{cout << endl;}}return 0;
}

DS二叉树—二叉树结点的最大距离相关推荐

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

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

  2. 求二叉树上结点的路径_剑指offer 二叉树

    二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...

  3. 二十七、二叉树--删除结点

    一.删除规则 如果删除的节点是叶子节点,则删除该节点 如果删除的节点是非叶子节点,则删除该子树. 注意到时候学习二叉排序树的时候删除非叶子结点就不是这样了 二.删除结点思路分析 三.代码实现 pack ...

  4. 二叉树节点间的最大距离问题

    二叉树节点间的最大距离问题 从二叉树的节点 A 出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点 B 时,路 径上的节点数叫作 A 到 B 的距离.求整棵树上节点间的最大距离. 如果二叉 ...

  5. 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点[数据结构]

    题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...

  6. 数据结构----二叉树叶子结点到根节点的高度计算

    数据结构----二叉树叶子结点到根节点的高度计算 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

  7. 《程序员代码面试指南》第三章 二叉树问题 二叉树节点间的最大距离问题

    题目 二叉树节点间的最大距离问题 java代码 package com.lizhouwei.chapter3;/*** @Description:二叉树节点间的最大距离问题* @Author: liz ...

  8. 求二叉树上结点的路径c语言版,求二叉树根到给定节点的路径设计报告.doc

    求二叉树根到给定节点的路径设计报告 题目: 求二叉树根到给定节点的路径 摘要:本程序设计题要求出二叉树的根节点到给定节点的路径,我们利用二叉树的双亲存储表示法建立二叉树,然后在树的叶子节点中找到给定的 ...

  9. DS二叉树—二叉树构建与遍历(不含框架)

    题解: 这里面myTree中的root成员是在main函数中声明,但在CreateTree中malloc,所以注意CreateTree函数要传引用. 题目: 问题 A: DS二叉树-二叉树构建与遍历( ...

最新文章

  1. 了解大脑的“小情绪”,轻松成为“效率达人”
  2. Silverlight 3.0 不再包含 asp:silverlight 控件
  3. statCVS的问题剖析
  4. 一块网卡绑定多个ip
  5. PoW 本质上是个去中心化的时钟
  6. python按列输出_在python中创建漂亮的列输出
  7. 从Oracle9i中发送电子邮件
  8. 阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务
  9. Android-alpha-渐变透明度 动画
  10. 和女孩子约会,肢体接触是不是不礼貌?
  11. 12306微信小程序上线 提供余票查询暂不支持购票
  12. HTTP请求报文格式与HTTP2.0
  13. 项目1-员工(绩效)信息管理系统
  14. ExtJs6学习(一)【ExtJs介绍】
  15. 几部科幻小说的评价和感想
  16. 用Interl 5100AGN 无线网卡破解无线网络WEP密码
  17. CTF php反序列化总结
  18. 区分Android中的各种单位——in、mm、pt、px、dp、dip、sp
  19. Keli5 打开Cypress CY7C68013A(51单片机)官方开发包例程
  20. [HNOI2005]狡猾的商人 差分约束+判环

热门文章

  1. Macbook键盘无法正常工作怎么办
  2. R5 2400G蓝屏 + 无法关机
  3. (错误记录)python3.9安装matplotlib3.2.2版本失败解决
  4. Tableau自定义百分比格式-实现增长率箭头向上向下
  5. 模拟银行存取款业务 简要代码
  6. HTML5-video标签-实现点击预览图播放或暂停视频
  7. 看完《寻梦环游记》,我抓爬了700多条影评
  8. 此微信号没有绑定到任公众号上,请更换微信号再试
  9. JAVA中pin什么意思_pin是什么意思?
  10. less命令常用快捷键