如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树相距最远的两个节点之间的距离。
分析: 对任意一个节点,以该节点为根,假设这个根有k个孩子节点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况。
1.若路径经过根Root,则U和V是属于不同的子树的,且它们都是该子树中到根节点最远的节点,否则跟它们的距离最远相矛盾。
2.若路径不经过Root,那它们一定同属于根的左子树或右子树,并且它们也是该子树中相距最远的两个顶点。
因此,问题就可以转化为在子树上的解,从而能够利用动态规划来解决。上代码:
#include <stdio.h>
#include <stdlib.h>
struct NODE{
NODE* pLeft;
NODE* pRight;
int nMaxLeft; //左子树中的最大深度
int nMaxRight; //右子树中的最大深度
char chValue; //该节点的值
};
int nMaxLen = 0;
void FindMaxLen(NODE* pRoot) {
if(pRoot == NULL) {
return;
}
if(pRoot->pLeft == NULL) {
pRoot->nMaxLeft = 0;
}else {
FindMaxLen(pRoot->pLeft);
int nTempMax = 0;
if(pRoot->pLeft->nMaxLeft > pRoot->pLeft->nMaxRight) {
nTempMax = pRoot->pLeft->nMaxLeft;
}else {
nTempMax = pRoot->pLeft->nMaxRight;
}
//加上到根节点的距离
pRoot->nMaxLeft = nTempMax + 1;
}
if(pRoot->pRight == NULL) {
pRoot->nMaxRight = 0;
}else {
FindMaxLen(pRoot->pRight);
int nTempMax = 0;
if(pRoot->pRight->nMaxLeft > pRoot->pRight->nMaxRight) {
nTempMax = pRoot->pRight->nMaxLeft;
}else {
nTempMax = pRoot->pRight->nMaxRight;
}
pRoot->nMaxRight = nTempMax + 1; //加上到根节点的距离
}
if(pRoot->nMaxLeft + pRoot->nMaxRight > nMaxLen) //最长距离经过root
nMaxLen = pRoot->nMaxLeft + pRoot->nMaxRight;
}
void createBinaryTree(NODE** pRoot) { //建二叉树
char c;
scanf("%c",&c);
if(c == '#') {
(*pRoot) = NULL;
}
else {
(*pRoot) = (struct NODE*) malloc(sizeof(struct NODE));
(*pRoot)->chValue = c;
createBinaryTree(&((*pRoot)->pLeft));
createBinaryTree(&((*pRoot)->pRight));
}
}
void printBinaryTree(NODE* pRoot) { //打印二叉树
if(pRoot == NULL)
return;
printf("%c",pRoot->chValue);
printBinaryTree(pRoot->pLeft);
printBinaryTree(pRoot->pRight);
}
int main() {
struct NODE* root = NULL;
createBinaryTree(&root);
printBinaryTree(root);
FindMaxLen(root);
printf("\nThe max length is: %d\n",nMaxLen);
return 0;
}
分享到:
相关推荐
求二叉树节点的最大距离求二叉树节点的最大距离求二叉树节点的最大距离
求二叉树上结点的路径 (树的后序遍历) 在采用链式存储结构的二叉树上,以bt指向根结点,p指向作任一给定的结点,求出从根结点到给定结点之间的路径。 不用调试,可直接运行。
java啊 二叉树建立,用递归与非递归的方法求结点之和
求二叉树最大宽度 数据结构 求二叉树最大宽度 数据结构
求二叉树中节点的最大距离
设计程序实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。 1 按先序次序建立一个二叉树 2按(A:先序 B:中序 C:后序 )遍历输出二叉树的所有结点
设计程序实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。 1 按先序次序建立一个二叉树 2按(A:先序 B:中序 C:后序 )遍历输出二叉树的所有结点 ...
( 统计二叉树结点.cpp )
C++ 二叉树结点类的实现 源代码 先序遍历 中序遍历 后序遍历 层次遍历
数据结构与算法 求二叉树上结点的路径 包括了代码和思路
该文档介绍了求二叉树叶子结点个数和遍历中序的算法和程序,相信对大家学习有很好的帮助。
数据结构实验 求二叉树叶子结点 C语言描述 源代码直接运行
采用先序法建立一棵二叉树,设计输出某结点数据为x的双亲结点的数据的程序,二叉树的数据域类型为字符型, 扩展二叉树的叶子结点用‘#’表示,要求可以求一棵二叉树中多个结点的双亲。
(1)二叉树的建立 (2)求出二叉树的高度 (3)求出二叉树结点个数 (4)先序遍历递归实现 (5)先序遍历非递归实现 (6)求出二叉树叶子结点个数
根据键盘输入的扩展二叉树的前序遍历序列建立相应的二叉树,并计算该二叉树的叶子结点个数
二叉树的三种遍历与求数的深度以及数的结点数 二叉树的三种遍历与求数的深度以及数的结点数
c语言 c语言编程题之树操作二叉树的最大深度
实现Create方法,要求键盘输入二叉树结点序列,创建一棵二叉树(提示:前序递归) 实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树(提示:前序递归) 增加InorderTree方法,采用非递归方法实现...
c语言,二叉树,数据结构,数据结构二叉树上结点的路径,实验报告,实验代码 全部都有 ,求二叉树节点路径