您的位置:首页 > 编程语言

编程之美:求二叉树中节点的最大距离(非递归法)

2015-09-10 17:34 429 查看
题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一颗二叉树中相距最远的两个节点之间的距离。

树的高度:树中节点的最大层次

相距最远的节点有2种情况:

1)经过根节点,2个节点在根节点左右子节点为根的子树上(左右子树不存在的时候以根节点代替节点);

      最远距离 = 左子树深度 + 右子树深度;

2)不经过根节点,2个节点在根节点的同一个子节点为根的子树上;

      最远距离 = 以左右子节点为根的子树的最远距离的最大值;

先求当前节点之前,先得求左右子节点为根的子树的深度,用递归肯定是很方便的方法,不过不用递归也是可以的。

二叉树的层次遍历会从根节点往子节点逐层遍历所有节点,把这些节点按顺序存储到双向链表中,再反向遍历双向链表中的各节点。

struct node
{
node* lchild;
node* rchild;
int   height;	//高度
//求经过当前节点的左右子树各取一个叶子节点的路线最大距离
int get_max_node_lengths()
{
int lheight = lchild ? lchild->height + 1 : 0;
int rheight = rchild ? rchild->height + 1 : 0;
height = lheight > rheight ? lheight : rheight;
return lheight + rheight;
}
};

int get_max_node_length(node* root)
{
//1.对二叉树进行层次遍历,将节点存入双向链表中
//2.反向遍历双向链表各节点,求以当前节点为根的子树高度,及该子树中经过当前节点的路线最大距离
//3.返回2中求出的距离的最大值
if (!root) return 0;
int max_node_lengths = 0;
list<node*> p;
list<node*>::iterator iter;
list<node*>::reverse_iterator rviter;
p.push_back(root);	//将根节点存入链表
//层次遍历二叉树节点,将节点存入双向链表p中
for (iter = p.begin(); iter != p.end(); ++ iter)
{
if ((*iter)->lchild)
{
//将非空左节点存入链表
p.push_back((*iter)->lchild);
}
if ((*iter)->rchild)
{
//将非空右节点存入链表
p.push_back((*iter)->rchild);
}
}
//反向遍历双向链表p中的节点
for (rviter = p.rbegin(); rviter != p.rend(); ++ rviter)
{
int cur_max_lengths = (*rviter)->get_max_node_lengths();
if (max_node_lengths < cur_max_lengths)
max_node_lengths = cur_max_lengths;
}
return max_node_lengths;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息