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

来源:互联网 发布:网络协议分析题库答案 编辑:程序博客网 时间:2024/05/16 08:53

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


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

相距最远的节点有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;}




1 0
原创粉丝点击