这个题目结合了最小公共祖先和求一个结点的层数两个题
首先找到两个结点的最小公共祖先后,
二叉树中两个结点的距离
问题
对于普通的二叉树,如何找到两个给定节点之间的距离?距离是指连接两个节点所需要的最小边的条数。
例如下面的二叉树:
这个问题很全面的考察了二叉树的相关的知识,建议大家先尝试自己解决
分析:
假设给定的节点为node1,node2,可以分为下面的两种情况:
1)node1是node2的祖先节点或孩子结点,可以理解为两个节点在一条线上。例如:Dist(2,4),Dist(6,1)
2)node1和node2没有直接或间接的父子关系。例如,Dist(4,3),他们需要一个共同的祖先结点1连接起来
假设lca是两个节点的最低公共祖先节点:
Dist(n1,n2)=Dist(root,n1)+Dist(root,n2)-2*Dist(root,lca)
class Solution1 {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return dfs(root,p,q);
}
TreeNode* dfs(TreeNode* root,TreeNode* p,TreeNode* q){
if(root == nullptr) return nullptr;
if(root == p || root == q) return root;
auto left = dfs(root->left,p,q);
auto right = dfs(root->right,p,q);
if(left && right) return root;
return left?left:right;
}
int findLevel(TreeNode* root,TreeNode* node){
if(root == nullptr) return -1;
if(root == node) return 0;
auto level = findLevel(root->left,node);
if(level == -1){
level = findLevel(root->right,node);
}
if(level != -1)
return level+1;
return -1;
}
int TowNodeDistance(TreeNode* root, TreeNode* p, TreeNode* q){
if(root == nullptr) return 0;
auto lca = lowestCommonAncestor(root,p,q);
int dis_lca = findLevel(root,lca);
int dis1 = findLevel(root,p);
int dis2 = findLevel(root,q);
return dis1 + dis2 - 2*dis_lca;
}
};