二叉树进阶之求一棵二叉树中结点间最大距离

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6618074.html

二叉树中的结点间距离:从结点A出发到达B,每个结点只能走一次,AB路径上的结点数就是AB间距离。

由于从一个结点出发时,只有两种方向可走:向上经过父节点到达它的兄弟子树;向下到达它自己的左右子树;

对于一个结点h为根的子树:假设现在从h左子树中最深的叶结点逐层向上走,一直走到h的左儿子,现在h.left有两种选择:

一是向上经过h,然后到达h的右子树向下走到最深叶结点;

二是从h.left的右儿子往下走,一直走到h.left的右子树的最深叶结点;

两种走法得到的路径长度的最大值,就是以h为根的子树的结点间距离最大值。

情况1:h.left的右子树比 h+h的右子树 更深

此时:以h为根的树的结点间最大距离在h的左子树中;

情况2:h+h的右子树 比h.left的右子树更深:

此时:h为根的树的结点间最大距离就是跨过h,从h的左子树最深处到h右子树最深的的路径距离。

从右边最深结点开始向上走的情况也一样:h+h.right的左子树 比 h的左子树 更深时,h树的结点间最大距离在h的右子树中;否则,就是经过h的,从右最深到达左最深的路径距离。

那么由以上情况我们就可以分析出:以h为根的二叉树的结点间最大距离的可能情况:

1:为左子树的结点间最大距离;

2:为右子树的结点间最大距离;

3:为经过h的左子树最深叶结点到右子树最深叶结点的路径长,亦即:h的左子树最大深度+h的右子树最大深度+1。

采用后序遍历的方式:对当前结点h,先获取左子树结点间最大距离以及左子树最大深度,再获取右子树结点间最大距离以及右子树深度,最后统计出h的结点间最大距离以及h的最大深度并返回上层。递归获取两个值:一个是子树的最大深度,一个是子树的结点间最大距离。其中,子树最大深度通过一个数组传引用的方式获取结果;子树的最大结点间距离则由递归函数的返回值返回.   

public int findLongest(TreeNode root) {
        int[] depth=new int[1];
        int max_distance=getMaxDistance(root,depth);
        return max_distance;

    }
   //递归获取两个值:一个是子树的最大深度,一个是子树的结点间最大距离。
    //其中,子树最大深度通过一个数组传引用的方式获取结果;子树的最大结点间距离则由递归函数的返回值返回
    public int getMaxDistance(TreeNode curr,int[] depth){
        //结点为空,则高度为0,结点最大距离为0
        if(curr==null){
            depth[0]=0;
            return 0;
        }
        //递归左子树获取左子树最大结点距离
        int left_child_max_distance=getMaxDistance(curr.left,depth);
        //通过数组获取左子树递归过程中统计出的子树深度
        int left_child_depth=depth[0];
        //递归右子树获取右子树最大结点距离
        int right_child_max_distance=getMaxDistance(curr.right,depth);
         //通过数组获取右子树递归过程中统计出的子树深度
        int right_child_depth=depth[0];
        //通过数组记录当前结点的高度
        depth[0]=Math.max(left_child_depth+1,right_child_depth+1);
        //比较 左子树最大结点距离、右子树最大结点距离、经过当前结点到达左右子树最深结点的路径距离,最大者就是当前结点为根的树的最大结点距离
        return Math.max(Math.max(left_child_max_distance,right_child_max_distance),left_child_depth+right_child_depth+1);

    }
时间: 2024-12-29 23:48:56

二叉树进阶之求一棵二叉树中结点间最大距离的相关文章

二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6618915.html  (规律:在二叉树中寻找某性质的,都应该以递归思维:从根结点开始递归左右,一直到底,由底向上返回的信息来判断当前结点.求当前结点.即:二叉树的题目,从下往上想,递归的返回过程就是从下往上由叶到根建立二叉树的过程,在此过程中对每一步的"根"结点作性质判断,返回到根时即是整棵树的性质判断了) 从一棵树中寻找结点数最多的二叉搜索子树,并返回这棵子树的头结点. 从题目我们知道以下要求

编程之美——3.8求二叉树中结点的最大距离(树,递归,动态规划)

<编程之美>读书笔记12: 3.8 求二叉树中节点的最大距离 问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 实际上就是求树的直径.若采用“动态规划方法”思想,会将该问题分解成“具有最大距离两点间的路径是否经过根节点”两个子问题,然后再对这两个子问题求解判断.实际上,不必这么麻烦.距离最远的两点必然在以某个节点A为根的子树上,它们间的路径必然经过该子树的根节

编程实现求一棵二叉树的最短树路径和最长树路径

Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. class Solution { public: int minDepth(TreeNode *root) { if(!r

比较两棵二叉树--(比较两棵二叉树是否相同/判断一棵二叉树是否是另一棵二叉树的子树)

一,问题介绍 本文章讨论两个问题: ①如何判断两棵二叉树的结构是一样的.对应的每个结点都有着相同的值.--即判断两棵二叉树是一样的 ②给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子结构 ③给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子树 注意,子结点与子树有那么一点点不同. 上面的二叉树B 是二叉树A 的子结构,但是不能说是二叉树A的子树.但是二叉树C 是 二叉树A的子树. 二,问题分析 1,如何判断两棵二叉树的结构是一样的.且对应的每个结点都有着相同的值. 对于①如何判断两棵二叉树

求 一棵二叉树中权值最大和最小的叶节点之间的距离

#include <iostream> #include <vector> //结点的数据结构 struct Node { int _data; int _weight; Node* _left; Node* _right; Node(const int& x = 0,int weight=0) :_left(NULL) , _right(NULL) , _data(x) , _weight(weight) {} }; //建树 Node* CreateTree(const

求一棵二叉树的高度

利用递归来求一棵树的高度,基本思想是:对于每一个非空节点,先求取其左子树的高度,然后求取其右子树的高度,最后取两子树中较高的一个加1作为以该节点为根的树的高度:对于空节点,直接返回0就可以了.求整棵树的高度只需将此思想运用到根节点上即可. struct BST_Node { int m_value; BST_Node* left_child; BST_Node* rigth_child; }; class BSTree { private: int nodeCount; BST_Node* ro

数据结构 - 求二叉树中结点的最大距离(C++)

// ------BTreeMaxNodeLength.cpp------ #include <iostream> using namespace std; template <class T> struct BTNode { // 左孩子 BTNode<T> *lChild; // 右孩子 BTNode<T> *rChild; // 该结点的值 T data; // 左子树最长距离 int leftSubTreeMaxLength; // 右子树最长距离

编程之美——二叉树中节点间最大距离

关于递归程序: 递归程序结构包括三部分:递归出口.逻辑处理(需要处理的问题).递归调用(衔接). 通过递归调用将问题转化为对子问题的解决,通过回溯完成原问题的解答: 递归与数学归纳法:递归是数学归纳法在计算机程序中的体现.使用递归思想设计程序时,我们设置base case,并假设我们会获得n-1的结果,并实现n的结果.这就好像数学归纳法,我们只关注初始和衔接,而不需要关注具体的每一步. 当问题采用递归算法求解时,代码如下: 1 #include<iostream> 2 #include<

二叉树基础算法--判断两棵二叉树是否相同

https://leetcode.com/problems/same-tree/ 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution {