3.8求二叉树中节点的最大距离

原创 2016年05月31日 12:26:08

题目

写一个程序求一棵二叉树中相距最远的两个节点之间的距离。

这里写图片描述

粗箭头的边表示最长距离。

分析:

相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点到它的根节点(单枝树)。

我们来考虑相距最远的两个节点是两个叶子节点的情况。

对于任意一个节点,以该节点为根,假设这个根有k个孩子节点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况。

1.若路径经过根节点,那么节点U和V属于两个不同的子树。那么就有U和V都是它们所在子树到根节点最远的节点。

2.若路径不经过根节点:

这里写图片描述

那么节点U和V一定属于根节点的k个子树之一。同时满足,它们是子树中相距最远的两个节点。

此时问题就能转化成在子树上的解,用动态规划,自底向上。
树R有k棵子树
设第k棵子树中相距最远的两个节点: Uk和Vk。
d(Uk,Vk)为子树k的最大距离。
假设Uk为子树k中到子树k的根节点Rk的距离最长的节点。
那么其到树的根节点R的距离定义为d(Uk,R)。
选出d(Ui,R)(1≤i≤k)中最大的两个值max1,max2,那么经过根节点R的最长路径为max1+max2+1。
所以树R中相距最远的两个节点的距离为:
max{d(U1,V1),d(U2,V2)…,d(Uk,Vk),max1+max2+1}。

代码:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std;
struct TreeNode{
    char val;
    TreeNode* left;
    TreeNode* right;
    int maxLenLeft;//左子树到父亲节点的最大长度
    int maxLenRight;
    TreeNode(char x) :val(x), left(NULL), right(NULL), maxLenLeft(0), maxLenRight(0){

    }
};

void createBinaryTree(TreeNode* &root){
    char ch;
    cin >> ch;
    if (ch == '#'){
        return;
    }
    root = new TreeNode(ch);
    createBinaryTree(root->left);
    createBinaryTree(root->right);
}
//递归
void findMaxLen(TreeNode* root,int &maxLen){
    if (root != NULL){
        findMaxLen(root->left,maxLen);
        findMaxLen(root->right,maxLen);
        if (root->left != NULL){
            root->maxLenLeft = max(root->left->maxLenLeft + 1, root->left->maxLenRight + 1);
        }
        if (root->right != NULL){
            root->maxLenRight = max(root->right->maxLenLeft + 1, root->right->maxLenRight + 1);
        }
        maxLen = max(maxLen,root->maxLenLeft+root->maxLenRight+1);
    }
}
//非递归
void findMaxLen_Nonrecursive(TreeNode* root,int &maxLen){
    stack<TreeNode*> s;
    TreeNode* cur = root;
    TreeNode* pre = NULL;
    while (cur != NULL || !s.empty()){
        while (cur != NULL){
            s.push(cur);
            cur = cur->left;
        }
        cur = s.top();
        //如果当前节点的右孩子为空,或者右孩子被访问过,那么访问当前节点
        if (cur->right == NULL || cur->right == pre){
            if (cur->left != NULL){
                cur->maxLenLeft = max(cur->left->maxLenLeft+1,cur->left->maxLenRight+1);
            }
            if (cur->right != NULL){
                cur->maxLenRight = max(cur->right->maxLenLeft+1,cur->right->maxLenRight+1);
            }
            maxLen = max(maxLen,cur->maxLenLeft+cur->maxLenRight+1);
            s.pop();
            pre = cur;
            cur = NULL;
        }
        else{
            cur = cur->right;
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/codeTZ/article/details/51544638

[编程之美]求二叉树中节点的最大距离

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 书上的解法 ...
  • lalor
  • lalor
  • 2012-06-02 21:37:10
  • 9016

求二叉树中节点的最大距离

  • 2008年05月25日 14:54
  • 286KB
  • 下载

二叉树中最远两个节点的距离

计算一个二叉树的最大距离有两个情况: 情况1: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。 情况2: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。 ...
  • qq_33417547
  • qq_33417547
  • 2016-12-01 16:47:34
  • 1540

二叉树系列——二叉树的最大距离(即相距最远的两个叶子节点,编程之美,百度面试题)

来自于编程之美3.8。 题目:如果我们把二叉树看做图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 如下图所示...
  • liuyi1207164339
  • liuyi1207164339
  • 2016-03-15 21:23:17
  • 5803

二叉树中节点的最大距离(java)

定义二叉树中节点的距离为节点之间边的个数。    一个二叉树中节点的最大距离由三部分综合求得:一部分是左子树中节点的最大距离,另一部分是右子树中节点的最大距离,最后一部分是左边的最大深度加上右边的最大...
  • a925907195
  • a925907195
  • 2015-07-19 22:56:01
  • 2535

Java:求二叉树中节点的最大距离

class Node{ public int data; public Node left; public Node right; public int leftmaxdistance; p...
  • sinat_33057149
  • sinat_33057149
  • 2017-10-06 20:18:22
  • 174

在二叉树中,距离最远的两个节点的距离

在二叉树中,找到距离最远的两个节点的距离 在二叉树中,找到距离最远的两个节点的距离。在上面的二叉树中,最远的节点的距离是:4(路径是2-3-13-5-2)。 解决思路:递归。最远的两个节点,...
  • jiyanfeng1
  • jiyanfeng1
  • 2012-09-06 14:11:18
  • 5827

二叉树的任意两节点间的最大距离

1.问题定义 如果我们把二叉树看成一个图,父子结点之间的连线看成是双向的,我们姑且定义“距离”为两节点之间边的个数。 写一个程序求一棵二叉树中相距最远的两个结点之间的距离 2.解法 计算一个二叉树...
  • patkritLee
  • patkritLee
  • 2016-08-09 15:02:53
  • 1932

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

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

java 求二叉树中节点的最大距离.

如果我们把二叉树看成一个图,   父子节点之间的连线看成是双向的,   我们姑且定义"距离"为两节点之间边的个数。   写一个程序,   求一棵二叉树中相距最远的两个节点之间的距离 ...
  • stonetudou
  • stonetudou
  • 2012-10-14 23:31:51
  • 1806
收藏助手
不良信息举报
您举报文章:3.8求二叉树中节点的最大距离
举报原因:
原因补充:

(最多只允许输入30个字)