问题描写叙述:

假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的。我们姑且定义"距离"为两节点之间边的个数。

写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。測试用的树:

n1

/             \

n2             n3

/        \

n4          n5

/     \         /   \

n6    n7    n8    n9

/                       /

n10                 n11

不幸的是。我一開始就把题目看错了:把“父子节点之间的连线看成是双向的”理解成为,在节点的定义中真的有指向父节点的指针。。。。

将错就错。我干脆把错误理解的题目先做出来再说。于是。为了实现非递归解法。自己定义了一种奇怪的数节点struct。。

于是。事情变成了:我为了解决题目。改了题目要求。。。。

。。

事实上对于原题。依据树结构,用我所定义的节点,初始化一棵变形二叉树,再用这样的非递归解法求解就可以。仅仅只是初始化树还须要做些工作。

这样的解法也不是全然没有意义。

。。

对于原题的解法。以后再说。

算法:

题目就是求一棵树中的最长路径

对于节点t,以它为根的树的最长路径longstpath一定是下列三个数中的最大值

①t的左子树的longstpath

②t的右子树的longstpath

③t的左子树的深度+t的右子树的深度+2

——结论1

所以对于每一个节点。有两个重要的属性:①以该节点为根的树的深度②以该节点为根的树的最大路径长度

从每一个叶节点開始,自底向上进行处理。

每次处理的过称为:

若该节点两个属性均已确定,将它们“告知”父节点。父节点得到全部子节点的属性后,依据结论1方可确定自己的两个属性。继续向上“报告”自己的属性。

对于没有了解到全部子节点属性的父节点,让他在每一次处理中”等待“子节点的报告,显然。须要一个队列queue存储正在等待的节点。

代码实现:

#include<iostream>
#include "Queue.h"
using namespace std;//节点结构体
struct BinaryTreeNode
{BinaryTreeNode* father = NULL;//指向父节点BinaryTreeNode* left = NULL;BinaryTreeNode* right = NULL;int arrived = 0;//记录子树深度值到达的数目。取值为0或1或2int depth = 0;//以此节点为根的树的深度int longstpath = 0;//以此节点为根的树中的最长路径bool stored = false;//是否已入列等待
};//取大值
int max2(int a, int b)
{if (a > b)return a;else return b;
}//取大值
int max3(int a, int b, int c)
{return max2(max2(a, b), c);
}//依据不同情况(有的节点无左/右子节点),更新longstpath
//longstpath一定是下面三数中的最大值:左子树的longstpath。右子树的longstpath。左右子树深度和+2
void SetLongstpath(BinaryTreeNode* temp)
{int lpath, rpath, ldepth, rdepth;if (temp->left){lpath = temp->left->longstpath;   ldepth = temp->left->depth;}else lpath = ldepth = 0;if (temp->right){rpath = temp->right->longstpath;   rdepth = temp->right->depth;}else rpath = rdepth = 0;temp->longstpath = max3(lpath, rpath, ldepth + rdepth + 2);//更新最长路径longstpath
}int FindPath(Queue<BinaryTreeNode*> &queue)
{BinaryTreeNode* temp;while (!queue.IsEmpty()){queue.Delete(temp);temp->stored = false;if (temp->arrived == 2)//子节点都到达了,万事俱备{SetLongstpath(temp);//更新temp的Longstpathif (temp->father)//若不是根节点。,则上移该节点(即对父节点进行处理){temp->father->depth = max2(temp->father->depth, temp->depth + 1);//更新父节点的深度值temp->father->arrived++;//到达子节点数目+1if (!temp->father->stored)//说明这是第一个到达的子节点。该父节点从未入列,则将其入列{queue.Add(temp->father);temp->father->stored = true;}}else//根节点,返回longstpathreturn temp->longstpath;}if (temp->arrived == 1)//有子节点还没到,更新longstpath的条件不充分。又一次入列等待子节点{queue.Add(temp);temp->stored = true;}}
}void main()
{BinaryTreeNode* n1 = new BinaryTreeNode;BinaryTreeNode* n2 = new BinaryTreeNode;BinaryTreeNode* n3 = new BinaryTreeNode;BinaryTreeNode* n4 = new BinaryTreeNode;BinaryTreeNode* n5 = new BinaryTreeNode;BinaryTreeNode* n6 = new BinaryTreeNode;BinaryTreeNode* n7 = new BinaryTreeNode;BinaryTreeNode* n8 = new BinaryTreeNode;BinaryTreeNode* n9 = new BinaryTreeNode;BinaryTreeNode* n10 = new BinaryTreeNode;BinaryTreeNode* n11 = new BinaryTreeNode;//构造二叉树n2->father = n3->father = n1;n4->father = n5->father = n2;n6->father = n7->father = n4;n8->father = n9->father = n5;n10->father = n6;n11->father = n9;n6->left = n10;n4->left = n6; n4->right = n7;n9->left = n11;n5->left = n8; n5->right = n9;n2->left = n4; n2->right = n5;n1->left = n2; n1->right = n3;n3->arrived = 2;//叶节点初始为2n7->arrived = 2;n8->arrived = 2;n10->arrived = 2;n11->arrived = 2;n6->arrived = 1;//但孩子节点初始为1n9->arrived = 1;Queue<BinaryTreeNode*> queue;queue.Add(n3);n3->stored = true;queue.Add(n7);n7->stored = true;queue.Add(n8);n8->stored = true;queue.Add(n10);n10->stored = true;queue.Add(n11);n11->stored = true;cout << "最大路径长度:" << FindPath(queue) << endl;system("pause");
}

转载于:https://www.cnblogs.com/blfshiye/p/5387463.html

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

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

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

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

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

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

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

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

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

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

    [试题描述] 方法:

  6. 求二叉树中从根结点到叶子结点的路径

    /** *    实验题目: *        求二叉树中从根结点到叶子结点的路径 *    实验目的: *        掌握二叉树遍历算法的应用,熟练使用先序.中序.后序3种递归 *    和非递 ...

  7. 201503-4 网络延时 (本质是求树的最长路径)

    树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...

  8. AcWing1072. 树的最长路径(树形DP)题解

    题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 现在请你找到树中的一条最长路径. 换句话说,要找到一条路径,使得使得路径两端的点的距离最 ...

  9. Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索

    题目描述 原题链接: https://www.acwing.com/problem/content/1074/ 思路 以下针对树的边权都一样的情况. 推荐使用BFS, 比赛的时候栈空间只有1MB,DF ...

最新文章

  1. IP phone配製學習
  2. 三星s8清除html查看器,三星S8手机怎么双清 清理手机数据方法介绍 - Iefans
  3. Azkaban启动与激活命令
  4. 虚拟化服务器类型,虚拟化服务器类型
  5. Windows Server 2008 R2 安全加固
  6. 获取spring里的bean
  7. (108)FPGA面试题-介绍STA静态时序分析及其作用
  8. 阿里一面,说说你知道消息中间件的应用场景有哪些?
  9. JDK11+Maven开发JavaFx启动问题:java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper
  10. 腾讯AI又搞出大动作:Robotics X机器人实验室成立,签Nature办新AI大会
  11. asp.net2.0学习历程 菜鸟到中级程序员的飞跃[z转]
  12. ExtJs6 响应式布局
  13. 通用技术标模板,技术方案书
  14. Sqlite3并发读写注意事项
  15. html 设置两个标签的相对距离_HTML 让上下两个DIV之间保持一定距离或没有距离...
  16. 计算机操作系统 - 内存管理
  17. 如何定制手机QQ空间的小尾巴
  18. wParam和lParam参数
  19. #define xxx后面啥都不跟是什么意思
  20. 数学归纳法及其证明(读书笔记——什么是数学)

热门文章

  1. spring cloud利用feign和sentinel进行内部或外部远程调用
  2. Android开发笔记(一百四十)Word文件的读取与显示
  3. Android开发笔记(一百一十三)测试工具
  4. Android开发笔记(一百零五)社会化分享SDK
  5. Android开发笔记(十九)底部标签栏TabBar
  6. swoole task 异步任务 注释请忽略 自己加的不一定对 别误导大家。。。。。。
  7. 基于JQuery做的一个简单的点击显示和隐藏的小Demo
  8. Java基础(二):基本数据类型和变量类型
  9. Linux怎样创建FTP服务器--修改用户默认目录-完美解决 - 费元星
  10. i.e., e.g., etc.