在 C++ 程式中查詢二叉樹中兩個節點之間的距離


在這個問題中,我們給定一棵二叉樹和兩個節點。我們的任務是建立一個程式來查詢二叉樹中兩個節點之間的距離。

問題描述

我們需要找到兩個節點之間的距離,即從一個節點到另一個節點遍歷的最小邊數。

讓我們舉個例子來理解這個問題,

輸入:二叉樹

節點1 = 3,節點2 = 5

輸出: 3

解釋

從節點 3 到節點 5 的路徑是 3 -> 1 -> 2 -> 5。遍歷了 3 條邊,距離為 3。

解決方案

解決此問題的一個簡單方法是使用給定節點的最近公共祖先節點,然後應用以下公式:

distance(node1, node2) = distance(root, node1) + distance(root, node2) + distance(root, LCA)

示例

 現場演示

#include <iostream>
using namespace std;
struct Node{
   struct Node *left, *right;
   int key;
};
Node* insertNode(int key){
   Node *temp = new Node;
   temp->key = key;
   temp->left = temp->right = NULL;
   return temp;
}
int calcNodeLevel(Node *root, int val, int level) {
   if (root == NULL)
      return -1;
   if (root->key == val)
      return level;
   int lvl = calcNodeLevel(root->left, val, level+1);
   return (lvl != -1)? lvl : calcNodeLevel(root->right, val, level+1);
}
Node *findDistanceRec(Node* root, int node1, int node2, int &dist1, int &dist2, int &dist, int lvl){
   if (root == NULL) return NULL;
   if (root->key == node1){
      dist1 = lvl;
      return root;
   }
   if (root->key == node2){
      dist2 = lvl;
      return root;
   }
   Node *leftLCA = findDistanceRec(root->left, node1, node2, dist1,dist2, dist, lvl+1);
   Node *rightLCA = findDistanceRec(root->right, node1, node2, dist1,dist2, dist, lvl+1);
   if (leftLCA && rightLCA){
      dist = dist1 + dist2 - 2*lvl;
      return root;
   }
   return (leftLCA != NULL)? leftLCA: rightLCA;
}
int CalcNodeDistance(Node *root, int node1, int node2) {
   int dist1 = -1, dist2 = -1, dist;
   Node *lca = findDistanceRec(root, node1, node2, dist1, dist2, dist, 1);
   if (dist1 != -1 && dist2 != -1)
      return dist;
   if (dist1 != -1){
      dist = calcNodeLevel(lca, node2, 0);
      return dist;
   }
   if (dist2 != -1){
      dist = calcNodeLevel(lca, node1, 0);
      return dist;
   }
   return -1;
}
int main(){
   Node * root = insertNode(1);
   root->left = insertNode(2);
   root->right = insertNode(3);
   root->left->left = insertNode(4);
   root->left->right = insertNode(5);
   root->right->left = insertNode(6);
   cout<<"Distance between node with value 5 and node with value 3 is"<<CalcNodeDistance(root, 3, 5);
   return 0;
}

輸出

Distance between node with value 5 and node with value 3 is 3

更新於:2020年10月9日

206 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告