变形二叉树中节点的最大距离(树的最长路径)——非递归解法
问题描写叙述:
假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的。我们姑且定义"距离"为两节点之间边的个数。
写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。測试用的树:
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
变形二叉树中节点的最大距离(树的最长路径)——非递归解法相关推荐
- 【编程题目】求二叉树中节点的最大距离
第 11 题(树) 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二 ...
- c++实现二叉树中节点的最大距离 - c++语言程序开发技术文章,c++实现二叉树中节点的最大距离...
文章前半部分能懂,可是后面的Milo不是很理解,可能有待以后学习..... 微软面试题之一,难度系数中,题目描述如下: 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看 ...
- 【100题】第十一题(二叉树中节点的最大距离)
一,题目: 如果把二叉树看成一个图,父子节点之间的连线看成是双向的(无向图),定义"距离"为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离 ...
- 求二叉树中节点的最大距离
struct node{ Node Left; Node Right; int MaxLeft;//左子树到该节点的最长距离 int MaxRight;//右子树到该节点的最长距离 char chVa ...
- 编程之美-求二叉树中节点的最大距离方法整理
[试题描述] 方法:
- 求二叉树中从根结点到叶子结点的路径
/** * 实验题目: * 求二叉树中从根结点到叶子结点的路径 * 实验目的: * 掌握二叉树遍历算法的应用,熟练使用先序.中序.后序3种递归 * 和非递 ...
- 201503-4 网络延时 (本质是求树的最长路径)
树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...
- AcWing1072. 树的最长路径(树形DP)题解
题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 现在请你找到树中的一条最长路径. 换句话说,要找到一条路径,使得使得路径两端的点的距离最 ...
- Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索
题目描述 原题链接: https://www.acwing.com/problem/content/1074/ 思路 以下针对树的边权都一样的情况. 推荐使用BFS, 比赛的时候栈空间只有1MB,DF ...
最新文章
- IP phone配製學習
- 三星s8清除html查看器,三星S8手机怎么双清 清理手机数据方法介绍 - Iefans
- Azkaban启动与激活命令
- 虚拟化服务器类型,虚拟化服务器类型
- Windows Server 2008 R2 安全加固
- 获取spring里的bean
- (108)FPGA面试题-介绍STA静态时序分析及其作用
- 阿里一面,说说你知道消息中间件的应用场景有哪些?
- JDK11+Maven开发JavaFx启动问题:java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper
- 腾讯AI又搞出大动作:Robotics X机器人实验室成立,签Nature办新AI大会
- asp.net2.0学习历程 菜鸟到中级程序员的飞跃[z转]
- ExtJs6 响应式布局
- 通用技术标模板,技术方案书
- Sqlite3并发读写注意事项
- html 设置两个标签的相对距离_HTML 让上下两个DIV之间保持一定距离或没有距离...
- 计算机操作系统 - 内存管理
- 如何定制手机QQ空间的小尾巴
- wParam和lParam参数
- #define xxx后面啥都不跟是什么意思
- 数学归纳法及其证明(读书笔记——什么是数学)
热门文章
- spring cloud利用feign和sentinel进行内部或外部远程调用
- Android开发笔记(一百四十)Word文件的读取与显示
- Android开发笔记(一百一十三)测试工具
- Android开发笔记(一百零五)社会化分享SDK
- Android开发笔记(十九)底部标签栏TabBar
- swoole task 异步任务 注释请忽略 自己加的不一定对 别误导大家。。。。。。
- 基于JQuery做的一个简单的点击显示和隐藏的小Demo
- Java基础(二):基本数据类型和变量类型
- Linux怎样创建FTP服务器--修改用户默认目录-完美解决 - 费元星
- i.e., e.g., etc.