编程之美:求二叉树中节点的最大距离(非递归法)
2015-09-10 17:34
429 查看
题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一颗二叉树中相距最远的两个节点之间的距离。
树的高度:树中节点的最大层次
相距最远的节点有2种情况:
1)经过根节点,2个节点在根节点左右子节点为根的子树上(左右子树不存在的时候以根节点代替节点);
最远距离 = 左子树深度 + 右子树深度;
2)不经过根节点,2个节点在根节点的同一个子节点为根的子树上;
最远距离 = 以左右子节点为根的子树的最远距离的最大值;
先求当前节点之前,先得求左右子节点为根的子树的深度,用递归肯定是很方便的方法,不过不用递归也是可以的。
二叉树的层次遍历会从根节点往子节点逐层遍历所有节点,把这些节点按顺序存储到双向链表中,再反向遍历双向链表中的各节点。
树的高度:树中节点的最大层次
相距最远的节点有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; }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例
- python数据结构之二叉树的建立实例
- python数据结构树和二叉树简介
- python数据结构之二叉树的统计与转换实例