(算法)二叉树两个结点的最远距离

题目:

求二叉树两个结点的最远距离。

二叉树定义如下:

class TreeNode{
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x):val(x),left(NULL),right(NULL){}
};

思路:

遍历每个节点,找出以当前节点为根的最长路径,然后找出所有最长路径中的最大值。

代码:

代码1:

class Node{
public:
    int val;
    Node* left;
    Node* right;
    int maxLeft;
    int maxRight;
};

void longestPath_1(Node* pRoot,int& maxLen){
    if(pRoot==NULL)
        return;
    if(pRoot->left==NULL)
        pRoot->maxLeft=0;
    if(pRoot->right==NULL)
        pRoot->maxRight=0;

    int leftLen;
    if(pRoot->left){
        longestPath_1(pRoot->left,maxLen);
        leftLen=1+max(pRoot->left->maxLeft,pRoot->left->maxRight);
        pRoot->maxLeft=leftLen;
    }

    int rightLen;
    if(pRoot->right){
        longestPath_1(pRoot->right,maxLen);
        rightLen=1+max(pRoot->right->maxLeft,pRoot->right->maxRight);
        pRoot->maxRight=rightLen;
    }

    maxLen=max(pRoot->maxLeft+pRoot->maxRight,maxLen);
}

代码2:

class TreeNode{
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x):val(x),left(NULL),right(NULL){}
};

void longestPath(TreeNode* pRoot,int& maxLeft,int& maxRight,int& maxLen){
    if(pRoot==NULL){
        maxLeft=0;
        maxRight=0;
        maxLen=0;
        return;
    }

    int maxLeft_1,maxLeft_2,maxRight_1,maxRight_2;
    longestPath(pRoot->left,maxLeft_1,maxRight_1,maxLen);
    longestPath(pRoot->right,maxLeft_2,maxRight_2,maxLen);

    maxLeft=1+max(maxLeft_1,maxRight_1);
    maxRight=1+max(maxLeft_2,maxRight_2);

    maxLen=max(maxLeft,maxRight)+1;
}
时间: 2024-08-03 05:12:15

(算法)二叉树两个结点的最远距离的相关文章

二叉树两个结点的最低共同父节点

后序遍历就行. //寻找二叉树两个结点的最低共同父节点 TreeNode *FindFirstCommonParentNode(TreeNode *pRoot, TreeNode *pNodeOne, TreeNode *pNodeTwo) { if (NULL == pRoot) { return NULL; } if (pRoot == pNodeOne || pRoot == pNodeTwo) { return pRoot; } TreeNode *pLeft = FindFirstCo

【编程题目】二叉树两个结点的最低共同父结点

75.二叉树两个结点的最低共同父结点(树)题目:二叉树的结点定义如下:struct TreeNode{int m_nvalue;TreeNode* m_pLeft;TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 思路:修改后序遍历 我的方法需要一个额外的整数n来标定. 开始想用非递归,结果写不出来... 只好用递归了.... /* 75.二叉树两个结点的最低共同父结点(树) 题目:二叉树的结点定义如下: struct TreeNode {

二叉树两个结点的最低共同父结点 微信:318175542

入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题.这个问题至 少有两个变种. 第一变种是二叉树是一种特殊的二叉树:查找二叉树.也就是树是排序过的,位于 左子树上的结点都比父结点小, 而位于右子树的结点都比父结点大. 我们只需要从根结点开 始和两个结点进行比较. 如果当前结点的值比两个结点都大, 则最低的共同父结点一定在当 前结点的左子树中. 如果当前结点的值比两个结点都小, 则最低的共同父结点一定在当前结 点的右子树中.

算法题——二叉树中结点的最远距离

题目:给定一棵二叉树,结点的距离就是两个结点之间路径包含的结点的数目,求结点的最大距离. 可以参考这两篇文章:<编程之美: 求二叉树中节点的最大距离>的另一个解法 和 Tree Diameter 思路: 在每一个结点处,求两个信息:以该结点为根的树的高度,以及以该结点为根的树中包含的最大距离. 因为所求的最大距离,如果是跨越根结点的,则为两个子树的树高度之和+1,如果是不跨越根结点的,则为左右子树中的最大距离的最大值. 代码: ①参考第一篇文章,每次返回两个值: 1 struct TreeNo

求解二叉树中两个结点的最低公共父结点

一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点.借用一张图如下: 结点8 和 结点5 的最低公共父结点为 结点2 二,二叉树的构建 与 求二叉树中第K层结点的个数 文章中的第二点:二叉树构建相同 三,求解最低公共父结点的算法实现 有两种思路,一种是通过中序遍历和后序遍历.由于中序遍历是先左子树中的结点,再访问根,再访问右子树中结点,因此这两个结点的公共父结点一定处于这两个结点之间. 如:中序遍历:8, 4, 9, 2, 5, 1, 6, 3, 7  

二叉树中两个结点最近的公共祖先汇总

一.若二叉树为搜索二叉树 原题链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on

求二叉树中任意两个结点的距离

求二叉树中任意两个结点的距离 实现步骤: 计算跟到第一个结点的距离: 计算跟到第二个结点的距离: 计算lca: 计算跟到lca结点的距离: 结果为(1) + (2) - 2 * (4),因为重复计算了两次的从跟到lca结点的距离: 1 class Node(object): def __init__(self, value=0): self.value = value self.left = self.right = None def get_path_length(root, n, path)

019写程序在一棵二叉树中找到两个结点的最近共同祖先(keep it up)

写程序在一棵二叉树中找到两个结点的最近共同祖先. 分两种情况来讨论这个题: 第一种情况结点中没有指向父结点的指针 第二种情况接种有指向父节点的指针 我们先看第一种情况,结点中没有指向父结点的指针. 我们可以采用暴力搜索每一个结点,如果这个结点的子树中 有已知的两个结点,那我们就继续沿着左右子树找,如果左子树 能找到,我们就继续沿着左子树找,如果有子树能找到,我们就 沿着右子树找,不存在两个子树都能够找到. 代码: struct TreeNode {<pre name="code"

二叉树中找两个结点的最近的公共祖先结点

#pragma once #include <iostream> using namespace std; /****************  * 二叉树中 找两个结点的最近的公共祖先结点 ******************/ struct Node {     Node* left;     Node* right;     int value;     Node(int v)         :value(v)         ,left(NULL)         ,right(NU